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)
就像您自己说的那样,C#版本是以下各项的简写:
private string _name;
public Name
{
get { return _name; }
set { _name = value; }
}
Run Code Online (Sandbox Code Playgroud)
(请注意,私有字段不可访问,它是由编译器生成的。所有访问都将通过属性进行,即使是在类内部也是如此)
与java相比,getter / setter只是方法,该构造在C#中称为属性,并且是编译器功能。