1

C# 中的许多代码示例都包含get代码set块。他们的目的是什么?我复制了这些块,它们出现在示例代码中,但不知道它的用途。有人可以向我解释一下吗?

4

5 回答 5

7

Getter 和 setter 使您能够将一对函数组合到一个属性中,并允许您使用看起来像成员访问表达式或赋值的语法来代替看起来像显式函数调用的语法。

这是一个小例子:而不是这个

internal class Example 
{
    private int x;

    public int GetX() => x;
    public void SetX(int value) => x = value;
}

...

var e = new Example();

e.SetX(123);
Console.WriteLine($"X = {e.GetX()}");

他们让你这样做:

internal class Example 
{
    public int X { get; set; }
}

...

var e = new Example();
e.X = 123;
Console.WriteLine($"X = {e.GetX()}");

第二个代码片段的语法更容易阅读,因为X它看起来像一个变量。同时,第二个片段提供了相同级别的封装,让您可以将实现隐藏在属性后面。

于 2013-09-23T18:20:20.930 回答
5

你是这个意思吗:

public int SomeValue { get; set; }

这基本上是语法简写:

private int someValue;
public int SomeValue
{
    get { return someValue; }
    set { someValue = value; }
}

它本身基本上是这个的简写:

private int someValue;
public int GetSomeValue() { return someValue; }
public void SetSomeValue(int value) { someValue = value; }

(尽管编译器在执行此操作时对事物的名称使用不同的约定。)

因为它与 OOP 相关,所以这是对数据的封装。这个想法是对象应该隐藏它们的数据并公开功能,而不是直接公开数据。因此,您不必someValue直接从对象外部进行修改。您调用对象的方法并为其提供值。对象在内部处理其数据的实际存储。

于 2013-09-23T18:21:16.563 回答
2
public int foo { get; set; }

这定义了一个属性。它基本上就像一个公共领域,但是当涉及到反射时,它就不同了。在 C#/.NET 中,将属性用于公共事物是很常见的。您可以将其与 Java 中的 getter/setter 方法进行比较。

现在很棒的是,您还可以使用自定义的get/set 代码或使. 这使您可以拥有 getter/setter 方法的优点,而无需使用丑陋的方法调用而不是属性访问。setget

public int foo {
    get { return this.some_foo; }
    set { this.some_foo = value; this.run_code_after_change(); }
};
于 2013-09-23T18:19:54.470 回答
0

在英语中,他们是 setter 和 getter。

希望你自学封装,setter 和 getter 是由于封装而兴起的。

同样用简单的英语,setter 和 getter 使您能够访问您定义的属性。

于 2013-09-23T18:19:04.613 回答
0

get并且set是一种语法糖。这是实现没有参数的函数的更易读的方法,您可以在其中插入例如验证(在 setter 中)或对 getter 中的字段进行计算。括号在这样的功能中是无用的。

于 2013-09-23T18:21:25.250 回答