首页 > 解决方案 > 带有参数的 C# 属性获取器和设置器

问题描述

我正在创建一个矩阵类,所以我已经有了一个

public double this[int row, col]

但我也想以类似的方式轻松设置和获取特定的行或列。我目前有:

public virtual Vector GetRow(int row)
{
    return m[row];
}

public virtual void SetRow(int row, Vector v)
{
    m[row] = v;
}

public virtual Vector GetCol(int col)
{
    return Transpose().m[col];
}

public virtual void SetCol(int col, Vector v)
{
    Matrix temp = Transpose();
    temp.SetRow(col, v);
    temp =  temp.Transpose();
    m = temp.m;
}

但我想要的是:

public virtual Vector Row(int row)
{
    get => return m[row];
    set => m[row] = value;
}

public virtual Vector Col(int col)
{
    // getter and setter logic here
}

有没有办法做到这一点?还是我绝对需要使用我创建的方法?我知道我可以按照我想要的方式来做行或列,但是,我不认为两者兼而有之。

标签: c#getter-setter

解决方案


为此,您需要了解属性的概念,让我们看一下Microsoft 文档

属性结合了字段和方法的各个方面。对于对象的用户来说,属性似乎是一个字段,访问该属性需要相同的语法。对于类的实现者来说,属性是一个或两个代码块,代表一个 get 访问器和/或一个 set 访问器。get 访问器的代码块在读取属性时执行;set 访问器的代码块在属性被分配一个新值时执行。没有 set 访问器的属性被认为是只读的。没有 get 访问器的属性被认为是只写的。具有两个访问器的属性是可读写的。

与字段不同,属性不属于变量。因此,您不能将属性作为 ref 或 out 参数传递。

这一行很重要:与字段不同,属性不归类为变量。因此,您不能将属性作为 ref 或 out 参数传递。

含义:您不能传递参数来获取和设置属性。它们在这里作为访问器-它们以对属性进行读\写的方式充当变量,但您不能将它们视为字段。

它们为什么存在?

  1. 在值的每次访问或突变开始时说 get 和 set 是烦人和分散注意力的。

  2. 提供对实际变量的直接访问会破坏封装,因此这不是一种选择。

意思是,它们在这里是为了帮助 OO 编程 conecpt - 保持封装,它们是在我们的程序中将值分配给变量的更简单方法。


推荐阅读