WPF吸气剂和二传手

joe*_*ogs 1 c#

通过阅读,我确定我正在经历与进入WPF时大多数人相同的过程。我来自嵌入式的挣扎。

以这些例子

  1. int foo; //

  2. int foo { get; set; } //c#

  3. public int foo{ get => foo; set => foo= value; }

  4. private int _foo;
    public int foo{ get => _foo; set => _foo= value; }
    
    Run Code Online (Sandbox Code Playgroud)

有人可以给我一个明确的答案,为什么所有吸气剂和吸气剂。
-它只是一个视觉工作室及其自动完成设置吗?
-是因为线程和foo在幕后被标记为易失性吗?
-还是发生了其他事情。

跟进
任何学习和为数据绑定而苦苦挣扎的人,“ 580”回复中“绑定”下的链接是迄今为止我所遇到的最好的例子,可以帮助您理解语法。我还遇到了Visual Studio的“ ReSharper”,它使您了解错误以及使用正确方法进行修复的正确方法。使用示例和重新磨合器,我在3小时内比上周了解了更多信息。

580*_*580 5

在这种情况下,get和set语法指示C#中的什么称为属性。属性不是特定于WPF,Visual Studio,线程或volatile关键字的。属性只是C#语言的一种构造。MSDN-属性

如果您来自嵌入式世界,我在这里假设具有C / C ++背景。C#中的普通旧标准成员变量称为字段。属性表示成员变量有些曲折。

关于为什么在各处都可以找到get和set关键字的明确答案是由于它们在属性中的使用。属性被广泛使用,因为通常认为它们比在大多数情况下使用字段更好。它们允许进行更细粒度的访问控制。我建议您仔细阅读Jon Skeet C#的这篇文章,深入探讨-属性为何如此重要


属性与领域

现在,对于某些细节,属性与字段有所不同,因为它们可以定义每次发生读取(获取)或修改(设置)时要执行的其他功能。此功能是隐式发生的,因此属性的使用者甚至可能不知道它。这一抽象层是为什么认为属性比字段更有价值的原因之一。

虽然属性不一定总是如此,但通常会封装传统上属于同一类型的私有字段。使用标准语法时{ get; set; },编译器将自动生成与属性相同类型的私有字段。这称为自动属性。例:

public string Title { get; set;}
Run Code Online (Sandbox Code Playgroud)

将由C#编译器转换为以下形式。

private string title;
public string Title
{
    get
    {
        return title;
    }
    set
    {
        title = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您自己手动/明确定义私有字段,则该字段将称为后备字段,有时也称为后备存储。您的示例#3和#4中的两个代表了这一点,其中#4显然更是如此。

如前所述,并非所有属性都需要封装字段。这是仅返回字符串文字的属性的示例。

public string RandomText { get { return "Foo"; } }
Run Code Online (Sandbox Code Playgroud)


现在来看您的示例:

  1. 如果是私有字段,则隐式声明私有,因为当未明确声明访问修饰符时,默认值为私有。MSDN-访问修饰符这不是属性,这是一个字段。 堆栈溢出-字段和属性之间有什么区别?
  2. 是具有等效的私有获取和设置的私有财产。get和set是私有的,因为没有显式的访问修饰符,它们将与属性的修饰符匹配。注意:获取和设置不能比属性更容易访问。意味着私有财产不能具有公共利益或公共场所;相同的受保护。我愿意声明这种特定语法几乎没有价值,但是我敢肯定有人可以证明我的意思。在这种情况下,我会说只使用一个字段。
  3. 由于此示例使用了#1中的字段,因此您实际上是在使用默认的自动生成字段,而使用后备字段。
  4. 这实际上与#3相同。@Sebastian Hofmann表示将被编译为相同的中间语言(IL)的意思是C#编译器会将这两个示例转换为相同的确切字节代码。维基百科-中级语言

捆绑

MSDN-数据绑定概述

关于数据绑定的有用阅读。MSDN-数据绑定