当前位置: 首页 > 知识库问答 >
问题:

.NET 中的 Getter 和 Setter 声明 [重复]

章宏恺
2023-03-14

我想知道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;
}

共有3个答案

吕奇
2023-03-14

有了这个,您可以在getset范围内执行一些代码。

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();
鄢修德
2023-03-14

好吧,第一个和第二个最终都会产生类似于第三个的东西。但是,当您具有属性语法时,请不要使用第三个语法。

最后,如果您在getset中没有工作要做,则使用第一个。

最后,第一个和第二个只是某种形式的语法糖,但为什么要编写比必要的更多的代码。

// more code == more bugs

只是为了找点乐子,请考虑以下几点:

public string A { get; private set; }

现在这更直截了当了,不是吗?公共修饰符隐含在获取上,但它可以被重写。对于定义属性本身时使用的任何修改器,这当然是相同的规则。

杜思远
2023-03-14

属性用于封装一些数据。您可以使用普通字段:

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_MyPropertyset_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