Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#3.0汽车性能—;有用与否?_C#_.net_Automatic Properties - Fatal编程技术网

C#3.0汽车性能—;有用与否?

C#3.0汽车性能—;有用与否?,c#,.net,automatic-properties,C#,.net,Automatic Properties,注意:这是我刚开始C#时发布的。有了2014年的知识,我真的可以说汽车性能是C#语言有史以来最好的东西之一 我习惯于使用私有和公共字段在C#中创建我的属性: private string title; public string Title { get { return title; } set { title = value; } } 现在,在3.0中,我们获得了自动属性: public string Title { get; set; } 我知道这更像是一个哲学/主观

注意:这是我刚开始C#时发布的。有了2014年的知识,我真的可以说汽车性能是C#语言有史以来最好的东西之一

我习惯于使用私有和公共字段在C#中创建我的属性:

private string title;
public string Title
{
    get { return title;  }
    set { title = value;  }
}
现在,在3.0中,我们获得了自动属性:

public string Title { get; set; }

我知道这更像是一个哲学/主观的问题,但是除了为每个字段保存五行代码之外,还有什么理由使用这些自动属性吗?我个人的抱怨是,这些财产对我隐瞒了一些东西,而我不是一个黑魔法迷

事实上,隐藏的私有字段甚至没有显示在调试器中,考虑到get/set函数什么都不做,这是可以的。但是,当我想要实际实现一些getter/setter逻辑时,无论如何我都必须使用private/public对

我看到了这样的好处:我保存了大量代码(一行对六行),而不会丢失以后更改getter/setter逻辑的能力,但是我已经可以通过简单地声明一个公共字段“publicstringtitle”,而不需要{get;set;}块,从而保存更多的代码来做到这一点


那么,我错过了什么?为什么有人真的想使用汽车属性?

我个人喜欢汽车属性。保存代码行有什么问题?如果您想在getter或setter中执行某些操作,那么以后将它们转换为普通属性是没有问题的

正如您所说的,您可以使用字段,如果您想在以后向字段添加逻辑,您可以将其转换为属性。但这可能会给反射的任何使用带来问题(可能在其他地方?)

属性还允许您为getter和setter设置不同的访问级别,这是字段无法做到的


我想这和var关键字是一样的。个人喜好的问题。

使用字段而不是属性的三大缺点是:

  • 不能将数据绑定到字段,而可以将数据绑定到属性

  • 如果一开始使用字段,以后就不能(轻松地)将其更改为属性
  • 有些属性可以添加到属性中,但不能添加到字段中

  • 我们总是在堆栈溢出中使用它们


    您可能还对以下内容的讨论感兴趣。我想这才是真正的反应,出于这个目的,这很好。

    我一直在使用自动属性。在C#3之前,我不必为所有的类型而烦恼,只使用公共变量

    我唯一怀念的是能够做到这一点:

    public string Name = "DefaultName";
    
     private string title;
    public string Title
    {
        get { return title;  }
        set { title = value;  }
    }
    

    您必须将默认值转换为具有属性的构造函数。单调:(

    我认为任何直观的构造和减少代码行的构造都是一大优点

    正是这些特性使得Ruby这样的语言如此强大(包括动态特性,这也有助于减少多余的代码)

    Ruby一直以来都是这样:

    attr_accessor :my_property
    attr_reader :my_getter
    attr_writer :my_setter
    

    我唯一的问题是它们做得不够。同一版本的编译器添加了自动属性,添加了分部方法。我不明白为什么他们不把这两者放在一起。一个简单的“分部OnChanged”会使这些东西变得非常有用。

    是的,它只保存代码。当你有大量代码时,阅读起来更容易。它们编写起来更快,维护起来也更容易。保存代码始终是一个好目标

    您可以设置不同的作用域:

    public string PropertyName { get; private set; }
    
    因此,属性只能在类内部更改。这并不是真正不变的,因为您仍然可以通过反射访问私有setter

    从C#6开始,您还可以创建true
    readonly
    属性,即不能在构造函数之外更改的不可变属性:

    public string PropertyName { get; }
    
    public MyClass() { this.PropertyName = "whatever"; }
    
    在编译时,将成为:

    readonly string pName;
    public string PropertyName { get { return this.pName; } }
    
    public MyClass() { this.pName = "whatever"; }
    

    在具有大量成员的不可变类中,这可以节省大量多余的代码。

    这里需要注意的一点是,据我所知,这只是C#3.0端的语法糖分,这意味着编译器生成的IL是相同的。我同意避免黑魔法,但同样的,相同内容的行数更少通常是一个好方法事情。

    在我看来,您应该始终使用自动属性而不是公共字段。也就是说,这里有一个折衷方案:

    从使用属性命名约定的字段开始

    • 需要从部件外部访问字段,或
    • 需要将逻辑附加到getter/setter
    这样做:

  • 重命名该字段
  • 保密
  • 添加公共属性
  • 您的客户端代码不需要更改


    不过,总有一天,你的系统会成长,你会把它分解成单独的程序集和多个解决方案。当这种情况发生时,任何暴露的字段都会回来困扰你,因为正如Jeff所提到的那样,。

    自动属性和C#中的任何其他东西一样都是一个黑魔法。一旦你从编译到IL而不是t的角度考虑它如果首先将其扩展为普通的C属性,那么它比许多其他语言构造的黑魔法要小得多。

    我使用CodeRush,它比自动属性快得多

    为此:

    public string Name = "DefaultName";
    
     private string title;
    public string Title
    {
        get { return title;  }
        set { title = value;  }
    }
    

    总共需要八次击键。

    对于代码段,相同名称的自动属性将总共有七次击键;)

    似乎没有人提到的一件事是,自动属性对于不可变的对象(通常是不可变的结构)是多么的不幸。因为你真的应该这样做:

    private readonly string title;
    public string Title
    {
        get { return this.title; }
    }
    
    (其中字段通过传递的参数在构造函数中初始化,然后为只读。)


    因此,这比简单的
    获取
    /
    私有集
    自动属性有优势。

    @Domenic:我不明白。。不能用自动属性执行此操作吗?:

    public string Title { get; }
    


    这就是您所指的吗?

    它很简单,很短,如果您想在属性体中创建一个真正的实现,那么