如何使属性使用{}而不是;进行设置?

3

这里有一个有趣的小知识,在互联网上我没有找到相关资料。这个想法是,如果你有一个属性,比如 int a { get; set; } ,它可以设置自己。

如何使用 int a { get { } set { } } 让属性设置自身?

set; 内发生了什么?

这是我尝试做的:

public string Symbol { get { return Symbol; } set { Symbol = value; NotifyPropertyChangedEvent("Symbol");  } }

但显然会产生堆栈溢出(Stack Overflow),因为它本质上是一遍又一遍地调用自己。

我不想创建10-20个私有变量来与我的属性一起使用,我想知道在set方法中发生了什么。

谢谢。


我不知道有什么方法可以避免冗长,但是代码片段可以帮助 - default.kramer
4个回答

10

set; 只是创建了一个你看不到的私有变量。抱歉,你需要那10-20个私有变量。


1
微软应该创建一个特定属性的关键字来访问这个“隐藏变量”,有点像value关键字。 - user1146887
1
@Rob 你可以自由前往微软提出建议。但是,Stack Overflow并不是建议新的C#功能的地方。 - Servy

2

你必须创建私有变量。

不幸的是,在这种特定情况下,这是唯一的方法。


1
如果您需要自定义逻辑,您需要自己提供支持字段:
private string symbol;
public string Symbol 
{ 
    get { return symbol; } 
    set { symbol = value; NotifyPropertyChangedEvent("Symbol");  } 
}

我不想创建10-20个私有变量来与我的属性一起工作,我想知道在set中发生了什么。
使用自动属性(例如:public string Symbol { get; set; }),编译器会自动创建后备字段。但是,如果没有自己管理后备字段,就无法引入逻辑(例如:触发事件)。

1

当代码被编译时,它会为你生成一个后备字段。由于尚未创建该字段,因此无法通过智能感知访问它。这相当于以下情况,其中“_a”尚未生成。

private int _a;
public int a
{
    get { return _a; }
    set { _a = value; }
}

但是你可以直接从类内部设置该属性。

public int a { get; set; }

a = ...;

此外,如果您只想在内部设置它,您可以在获取和设置上设置修饰符;
public int a { get; private set; }

1
微软应该创建一个特定属性的关键字来访问这个“不可见变量”,有点像值关键字。 - user1146887
@Rob 如果你想要访问后备字段,我建议你在编辑器中使用“propfull”代码片段而不是“prop”代码片段。简写的“{ get; set; }”主要优点是,如果需要,在不必重新编译依赖代码的情况下,你可以轻松地稍后添加后备字段和完整方法。 - Malgaur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接