【问题标题】:Need declare a field corresponding a property in c#?需要在 c# 中声明一个对应于属性的字段吗?
【发布时间】:2013-10-16 09:09:41
【问题描述】:

有什么区别

private string someText;

public string SomeText
{
    get;
    set;
}

public string SomeText
{
    get;
    set;
}

【问题讨论】:

标签: c# properties


【解决方案1】:

什么都没有,你的私人会员没有被使用。

编译器会编译

public string SomeText
{
     get;
     set;
}

相当于

private string _someText;

public string SomeText
{
   get { return _someText; }
   set { _someText = value; }
}

【讨论】:

  • 我认为这里很重要的一点是,该字段实际上并没有被称为_someText,它的名称是您无法在代码中编写的。
  • @svick 是的,但我认为最好显示正确的命名标准并说“等效”而不是寻找它实际生成的确切代码[CompilerGenerated]private string <SomeText>k__BackingField;see here
【解决方案2】:

您确实意识到您的问题是比较两个相同的事物? (

public string SomeText
{
    get;
    set;
}

)

我在想你的问题到底是什么 - 有什么区别

private string someText;

public string SomeText
{
    get
     {
       return someText;
     }

    set 
     {
      someText = value;
     }
}

和:

public string SomeText
{
    get;
    set;
}

答案是,在第二个示例中,支持字段仍然存在,但是是为您创建的 - 您对设置/获取没有影响;而在第一个示例中,您可以进行其他检查以确保它是设置的有效值等。

【讨论】:

    【解决方案3】:

    我想也许你想知道两者的区别

    public class Test1
    {
        private string _text;
        public string Text
        {
            get { return _text; }
            set { _text = value; }
        }
    }
    

     public class Test2
    {
        public string Text
        {
            get;
            set;
        }
    }
    

    如果你将这两个类反汇编成 CIL,你会发现它几乎是一样的,除了在第二种情况下,字段是自动生成的。

    第一种情况:

    .property instance string Text
    {
        .get instance string Syner.Test1::get_Text()
        .set instance void Syner.Test1::set_Text(string)
    }
    
    
    .field private string _text
    

    第二种情况:

     .property instance string Text
    {
        .get instance string Syner.Test2::get_Text()
        .set instance void Syner.Test2::set_Text(string)
    }
    
    
    .field private string <Text>k__BackingField
    {
        .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
    }
    

    【讨论】:

      【解决方案4】:

      第二个只是语法糖:

      private string someText;
      
      public string SomeText
      {
          get { return someText; }
          set { someText = value; }
      }
      

      第二个自动在幕后为您处理变量创建等。在您的第一个示例中,私有变量 someText 永远不会被读取/修改,它只是一个不执行任何操作的类级别变量。

      您可能想要使用第一个的原因是如果您需要在 getter/setter 中做一些更复杂的事情。例如,您可能想检查是否在 getter 中初始化了某些内容。或者您可能想要验证 setter 中的值。

      【讨论】:

      • 您的意思是,好像在第一个示例中,实际使用了该字段。
      猜你喜欢
      • 2019-12-17
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多