我想知道getter和setter的声明有什么区别,是否有首选方法(以及为什么)。第一个可以由Visual Studio自动生成。其他的怎么样?谢谢
一号
string _myProperty { get; set; }
第二
string _myProperty;
public string myProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
第三
string _myProperty;
public string getMyProperty()
{
return this._myProperty;
}
public void setMyProperty(string value)
{
this._myProperty = value;
}
有了这个,您可以在get
或set
范围内执行一些代码。
private string _myProperty;
public string myProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
您还可以使用自动属性:
public string myProperty
{
get;
set;
}
Net Framework将为您管理。它之所以被创建,是因为它是一个很好的实践,并且使其易于实现。
您还可以控制这些范围的可见性,例如:
public string myProperty
{
get;
private set;
}
public string myProperty2
{
get;
protected set;
}
public string myProperty3
{
get;
}
现在,在C#中,可以初始化属性的值。对于示例:
public int Property { get; set; } = 1;
如果也可以定义它并使其只读,无需设置。
public int Property { get; } = 1;
最后,您可以定义一个箭头函数。
public int Property => GetValue();
好吧,第一个和第二个最终都会产生类似于第三个的东西。但是,当您具有属性语法时,请不要使用第三个语法。
最后,如果您在get
或set
中没有工作要做,则使用第一个。
最后,第一个和第二个只是某种形式的语法糖,但为什么要编写比必要的更多的代码。
// more code == more bugs
只是为了找点乐子,请考虑以下几点:
public string A { get; private set; }
现在这更直截了当了,不是吗?公共
修饰符隐含在获取
和集
上,但它可以被重写。对于定义属性本身时使用的任何修改器,这当然是相同的规则。
属性用于封装一些数据。您可以使用普通字段:
public string MyField
但是这个字段可以被你的类的所有外部用户访问。人们可以插入非法值或以您意想不到的方式更改值。
通过使用属性,您可以封装访问数据的方式。C#有一个很好的语法可以将字段转换为属性:
string MyProperty { get; set; }
这称为自动实现的属性。当需要时,您可以将您的财产扩展到:
string _myProperty;
public string MyProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
现在,您可以在 setter
中添加验证值的代码:
set
{
if (string.IsNullOrWhiteSpace(value))
throw new ArgumentNullException();
_myProperty = value;
}
属性也可以为getter和setter提供不同的访问器:
public string MyProperty { get; private set; }
通过这种方式,您创建了一个所有人都可以读取但只能由类本身修改的属性。
您还可以为您的getter
添加完全自定义的实现:
public string MyProperty
{
get
{
return DateTime.Now.Second.ToString();
}
}
当 C# 编译自动实现的属性时,它会生成中间语言 (IL)。在您的 IL 中,您将看到一个get_MyProperty
和set_MyProperty
方法。它还创建了一个名为
按照惯例,您不应该将属性用于耗时的操作。
问题内容: 始终建议使用getter / setter访问私有变量。为什么最好将它们声明为public并对其进行访问。无论如何,我们正在使用getter和setter访问它? 问题答案: @mre的回答非常好,您的问题很重要。总结一下:您将对象的字段设置为私有,以控制其他对象使用它的方式。您的对象使用setter来: 限制和验证传递给设置器的数据 隐藏其内部数据结构(服务对其他对象感兴趣,而不是服
有两种类型的对象属性。 第一种是 数据属性。我们已经知道如何使用它们了。到目前为止,我们使用过的所有属性都是数据属性。 第二种类型的属性是新东西。它是 访问器属性(accessor properties)。它们本质上是用于获取和设置值的函数,但从外部代码来看就像常规属性。 Getter 和 setter 访问器属性由 “getter” 和 “setter” 方法表示。在对象字面量中,它们用 get
问题内容: 案例A 不遵循Getter&Setter约定 human / human.go main / main.go 案例B 遵循getter和setter约定 main / main.go 以下约定的问题是,在提供其字段名称时无法实例化该结构。我想使用约定,但是我只能使用私有访问。 问题答案: 实例化结构(或对象,采用面向对象的语言)时,无论如何都不应指定私有字段的值。但是,提供可能以私有字
利用 getter/setter 可以拦截操作对象的属性,在设置属性前或获取属性前做一些事情。 1. getter get语法将对象属性绑定到查询该属性时将被调用的函数。(MDN) // 语法 var 对象 = { get 属性名() { // 做一些事情 balabala return 值; } }; getter 在获取一个属性时被调用,同时返回 getter 的返回
我写了我自己的AST转换,它应该生成getter和setter方法(在这里创建getter方法)。但是他们不工作,不能理解原因。 使用属性创建注释 我的AST转换代码应该为注释字段创建getter方法 注释检查 在哪个地方我犯了错误? 运行结果: 线程“main”groovy中出现异常。lang.MissingMethodException:没有方法ua的签名。家插科打诨。用法实例getMyCou