C#速记吸气剂和二传手

use*_*206 8 c# java getter setter getter-setter

C#中的Setter和Getters如何实现封装?对于这些setter和getter,我不是新手,我有编程背景,特别是java.在java中你使用像这样的setter和getter

public class Person {
    private String fName;

    public void setName(String someName) {
        fName = someName;
    }

    public String getName() {
        return fName;
    }
}

public class Test {

    public static void main(String[] args) {
        Person p = new Person();

        p.setName("Bob");
        System.out.println(p.getName());
    }
}
Run Code Online (Sandbox Code Playgroud)

而在C#中使用速记

public class Person {
    public string fName{ get; set;}
}
Run Code Online (Sandbox Code Playgroud)

C#速记getter和setter如何实现封装?我如何实现与上面的java代码相同的C#代码?对它有任何限制吗?根据我的观察,我只能使用"fName",如果它设置为public,特别是"public string fName {get; set;}",但是当涉及到private时我不能.但是当我将它设置为私有时,我无法再以其他方式访问它.

Chr*_*ain 12

它们不允许您指定封装行为.他们所做的是允许您指定这是您的类的公共接口中的属性,而不是字段.

这里的区别在于,在Java中,getter和setter只是遵循特定约定的方法(getXXX,setXXX).在C#中,属性是一流的构造(即使它们基本上是幕后的getter和setter).因此,C#提供了这些作为一种简写方式,表示您可以稍后实现封装(例如,向getter或setter添加行为)但您不希望破坏类的使用者,因此您事先声明它们是属性.

在Java中:

public class Foo {
    private String fooName;
    public String BarName;
    public String getFooName() { return fooName; }
    public String setFooName(String fooName) { this.fooName = fooName; }

}
Run Code Online (Sandbox Code Playgroud)

在C#中:

public class Foo {
    public String FooName { get; set; }
    public String BarName;
}
Run Code Online (Sandbox Code Playgroud)

让我们假设您在另一个引用Foo程序集的程序集中定义了一个消费者类FooReader:

public class FooReader {
    public String ReadFoo(Foo foo) {
        // This returns the Foo **property**
        return foo.FooName;
    }

    public String ReadBar(Foo foo) {
        // This returns the Bar **field**
        return foo.BarName;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,将Foo更改为此不会破坏FooReader:

public class Foo {
    private String _fooName;
    public String FooName { get { return _fooName.ToUpper(); } set { _fooName = value; } }
    public String BarName;
}
Run Code Online (Sandbox Code Playgroud)

但改变Foo到这破坏FooReader-你需要重新编译它:

public class Foo {
    private String _fooName;
    private String _barName;
    public String FooName { get { return _fooName.ToUpper(); } set { _fooName = value; } }

    // This breaks FooReader because you changed a field to a property
    public String BarName { get { return _barName.ToUpper(); } set { _barName = value; } }
}
Run Code Online (Sandbox Code Playgroud)


Fem*_*ref 5

就像您自己说的那样,C#版本是以下各项的简写:

private string _name;

public Name
{
   get { return _name; }
   set { _name = value; }
}
Run Code Online (Sandbox Code Playgroud)

(请注意,私有字段不可访问,它是由编译器生成的。所有访问都将通过属性进行,即使是在类内部也是如此)

与java相比,getter / setter只是方法,该构造在C#中称为属性,并且是编译器功能。

  • 除了后备字段的名称是编译器生成的名称之外,该名称无法从C#代码中使用。 (2认同)