如何在C#中调用getter或setter

32

我知道如何创建获取器(Getters)和设置器(Setters)

public myClass
{
    public int myVal { get; set; }

    // more stuff
}

但是我不知道如何稍后调用它。
public myOtherClass
{
    public myOtherClass()
    {
         myClass localMyClass = new myClass();

         localMyClass.???set??? = 42;  
         // Intelisense doesn't seem to give any obvious options after I enter 
         // the period.
    }
}

我该如何在localMyClass中设置myVal的值?

如果在Intellisense中没有显示出来,那么它可能不是有效的可编译代码?没有标准的“ing”类型,如果确实列出了属性设置器,即使没有“set”在前面,也很难错过。此外,所选择的命名约定让我感到非常不舒服。 - user166390
5个回答

27
localMyClass.myVal = 42;

Getter和Setter让您像处理公共属性一样处理值。不同之处在于,您可以在执行获取和设置的函数内进行任何操作。

示例:

存储其他变量

private int _myVal, myOtherVal;
public int MyVal { get; set { _myVal = value; myOtherVal++; } }

虚构数字/返回常数

public int MyVal { get { return 99; } set; }

抛弃setter

private int _myVal;
public int MyVal { get { return _myVal; } set { ; } }
在每个情况中,用户会觉得这只是一个公共数据成员,并简单地输入。
localMyClass.myVal = 42;
int i = localMyClass.myVal;

通过使用getter和setter函数,你可以自己实现一个类。 此外,正如Hogan所说:“有许多库和附加组件(例如MVC.NET)需要您使用getter和setter函数”,即使只是针对{get; set;}这种简单情况。


所以,如果我在设置一个值时不需要做任何其他事情,而且我从未打算这样做,也没有任何东西强制我拥有getter/setter(例如ASP.NET);除了它是编写成员的正常方式之外,没有真正的优势(就像给类赋予与文件相同的名称一样-你不必这样做,但实际上每个人都这样做)? - BIBD
1
@CodeSlave - 这样做只是一种好的方式,因为它创建了一个与数据交互的界面,从而将数据和实现分离。 - Hogan
1
@CodeSlave 是的。如果它只是一个“公共”变量,并且没有强制你采取措施,那么就将其设置为公共成员。你可以就如何通过一个访问器进行语义论证,但在我看来,这可能过度了。 - Scott Mermelstein
@Hogan 如果你正在为MVC.Net定义一个模型,你必须使用访问器而不是公共成员,以便服务器自动填充写回的成员。(我已经因此受过好几次伤害了。) 在代码底层,它使用反射并寻找访问器方法。 - Scott Mermelstein
好的,我可以接受。所有酷酷的孩子都在做它,而且它对我没有伤害,因此我也会这样做 :-) - BIBD
显示剩余5条评论

13

设置:

localMyClass.myVal = 42

获取:

int variable = localMyClass.myVal;

6

从外部来看,访问getter和setter的语法与访问变量的语法无法区分。赋值会转换为调用setter,而普通表达式使用则转换为调用getter。

在Intellisense中,在变量名后放置一个点.后,应该打开getter和setter列表。属性应该在左侧具有蓝色标记(而不是方法左侧的品红色标记)。


5
你想要这个
localMyClass.myVal = 42;  

调用setter方法
还有这个
varName = localMyClass.myVal;

调用getter方法。

2
获取:var tmp = localMyClass.myVal;

设置:localMyClass.myVal = 2;


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