【发布时间】:2021-04-12 07:47:32
【问题描述】:
考虑将类 A 与任何类型的私有字段 _data(例如 int)和属性 Data 一起使用该字段:
public class A
{
private int _data;
public int Data
{
get => _data;
set => _data = value;
}
// Constructor is redudant, I created that for testing purposes...
public A(int data)
{
_data = data;
}
}
现在考虑类B 具有相同的私有字段_data 和属性Data,它只返回对我们字段的引用:
public class B
{
private int _data;
public ref int Data
{
get => ref _data;
}
// Constructor is redudant, I created that for testing purposes...
public B(int data)
{
_data = data;
}
}
现在我找不到答案的问题:如果Data 没有set 修饰符,为什么我能够在B 类的实例中更改_data 的值?
B b = new B(50);
// This line doesn't produce any warnings or errors
b.Data = 100;
Console.WriteLine(b.Data == 100); // True
它是否像 C/C++ 中的 pointers 一样工作,并且编译器理解这个属性只是一个 pointer,所以它会自动为这个指针指向的内容赋值(没有任何特殊的运算符和/或铸造)还是我遗漏了什么?
我在docs.microsoft.com(同时搜索Properties 和ref)上找不到有关此问题的答案,因此不胜感激。
【问题讨论】:
-
你可以做任何你想做的事情*
_data。您不需要带有 setter 的属性来修改同一类中的私有字段。 -
_data 不知道数据。它们都是完全独立的整数。一个属性将用于控制对类外部私有字段的访问,但在内部你可以对 _data 做任何事情(就像@BrootsWaymb 说的那样)。
标签: c# properties ref