c# - 带有参数的 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
}
有没有办法做到这一点?还是我绝对需要使用我创建的方法?我知道我可以按照我想要的方式来做行或列,但是,我不认为两者兼而有之。
解决方案
为此,您需要了解属性的概念,让我们看一下Microsoft 文档:
属性结合了字段和方法的各个方面。对于对象的用户来说,属性似乎是一个字段,访问该属性需要相同的语法。对于类的实现者来说,属性是一个或两个代码块,代表一个 get 访问器和/或一个 set 访问器。get 访问器的代码块在读取属性时执行;set 访问器的代码块在属性被分配一个新值时执行。没有 set 访问器的属性被认为是只读的。没有 get 访问器的属性被认为是只写的。具有两个访问器的属性是可读写的。
与字段不同,属性不属于变量。因此,您不能将属性作为 ref 或 out 参数传递。
这一行很重要:与字段不同,属性不归类为变量。因此,您不能将属性作为 ref 或 out 参数传递。
含义:您不能传递参数来获取和设置属性。它们在这里作为访问器-它们以对属性进行读\写的方式充当变量,但您不能将它们视为字段。
它们为什么存在?
在值的每次访问或突变开始时说 get 和 set 是烦人和分散注意力的。
提供对实际变量的直接访问会破坏封装,因此这不是一种选择。
意思是,它们在这里是为了帮助 OO 编程 conecpt - 保持封装,它们是在我们的程序中将值分配给变量的更简单方法。
推荐阅读
- ios - 删除动态调整表视图的行?
- c# - 将 EF DatabaseContext 注入自定义 ScopedService
- c# - 获取 UWP 应用程序中所有监视器显示的边界
- postgresql - 是否有针对不同项目的联合表的模式?
- vba - 如何为每个循环向下移动 1 行直到单元格为空
- python - 用 shapefile 或 geopandas 绘制蒙面的南极洲
- c++ - 派生类不使用基类中的所有纯虚方法
- sql - 如何检查每条记录是否有多个列不为空?
- svn - 文件在 SVN 中标记为已修改但没有更改
- excel - 代码需要移动 2000 行以查看范围内的任何单元格是否有“Y”,是否在第一列中写入“Y”