【问题标题】:Quick Question About Get and Set关于获取和设置的快速问题
【发布时间】:2010-10-14 14:35:09
【问题描述】:

如果类中有以下代码,get和set方法是否与变量关联?如何使用类的实例访问 get 和 set?

public string Something { get; set; }

【问题讨论】:

  • 不,它被称为自动属性(魔法)

标签: c# get set


【解决方案1】:

这本质上是一个编译器技巧。当你编译代码时,编译器会生成一个隐藏字段以及在get和set中返回和设置字段的必要代码。

您可以像访问任何其他属性一样访问此属性。 MyClass.Something = "bla".

【讨论】:

    【解决方案2】:

    .Net Framework 3.5(自动属性)附带此语法

    就像:

    private string something;
    public string Something
    {
         get { return something; }
         set { something = value; }
    }
    

    要访问这个变量(应该在 MyClass 类中):

    // GET
        MyClass myObj = new MyClass();
        string test = myObj.Something;
    // SET
        myObj.Something = "blabla";
    

    【讨论】:

      【解决方案3】:

      这是一个自动属性,它会在编译器中创建一个支持字段,您无需为其编写代码。

      得到:

      var str = instance.Something;
      

      设置:

      instance.Something = "new value";
      

      【讨论】:

        【解决方案4】:
        1. 这是编译器的新特性
        2. 称为自动属性
        3. 您无需为自动属性定义后备存储,编译器会为您完成这项工作。
        4. 您不能在自动属性中注入自定义代码,您需要恢复到正常的 1.1 声明属性样式。
        5. 您可以像访问普通属性一样访问自动属性

        【讨论】:

          【解决方案5】:

          编译器会为您创建一个包含 getter 和 setter 方法 (*) 的支持变量,但您不会在标准代码中看到它们。您只需直接访问该属性即可。

          myClass.Something = "blah"; // uses set
          string myValue = myClass.Something; // uses get;
          

          *这些方法是为属性创建的,而不是它们是否自动实现。在自动实现属性的情况下,编译器生成的支持变量被添加到混合中。

          【讨论】:

          • 不能在不指定 {get;set;} 的情况下使用此代码吗?我很迷茫
          • @Soo:是的,这将定义一个公共字段,例如public string Something;。不同之处在于,对于属性,您可以(明确地)拥有支持变量,您可以在 setter 中进行验证,您可以拥有不同的访问权限get 和 set 的修饰符(所以也许外部代码可以获取该值,但只有类本身可以设置它),或者上面的组合加上我没有提到的其他内容。首选方法是通过属性而不是字段公开数据。
          【解决方案6】:

          这类似于下面的代码,但击键次数要少得多:-)

          public string Something {
              get() {
                  return _Something;
              }
              set(string value) {
                  _Something = value;
              }
          }
          

          【讨论】:

          • 别忘了声明你的 _Something 变量 ;-)
          【解决方案7】:

          编译器会这样:

          public string Something { get; set; } 
          

          变成这样的东西(在 IL 中,为方便起见转换为 C#):

          string _something;
          public string get_Something() { return _something; }
          public void set_Something(string value) { _something = value; } 
          

          另外,编译器会转换这些行:

          Something = "test";
          var result = Something;
          

          进入这个:

          set_Something("test");
          var result = get_Something();
          

          所以你看,下面都是方法调用(就像在 Java 中一样),但在 C# 中拥有属性语法确实是 sweet。但是如果你尝试直接调用这些方法,你会得到一个error

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-04-18
            • 2020-05-26
            • 2021-08-06
            • 2020-02-11
            • 2010-12-12
            • 2011-07-25
            • 1970-01-01
            相关资源
            最近更新 更多