关于Java“属性”和C#属性之间的区别

本文关键字:属性 之间 区别 Java 关于 | 更新日期: 2023-09-27 17:56:55

作为实习的一部分,我在C#工作了整整六个月。我在实习中学到的是 C# 属性、AKA 二传手和获取者的美感。在实习之初,属性也是我困惑的根源,但使用了一段时间,我爱上了它。

回到Java上课,我不得不告别它。

直到。。我开始了这个简单的作业:

我的方法和构造函数:

private double xCoor;
private double yCoor;
public Point(double xCoor, double yCoor)
{
    this.xCoor = xCoor;
    this.yCoor = yCoor;
}
public void setCoor(double xCoor, double yCoor)
{
    this.xCoor = xCoor;
    this.yCoor = yCoor;
}
public void printCoor()
{
    System.out.println("(" + xCoor + ", " + yCoor + ")");
}

为了演示,这是我的主要方法:

    Point pointOne = new Point(6.0, 7.0);
    pointOne.printCoor();
    pointOne.setCoor(9.0, 3.0);
    pointOne.xCoor = 9.0;
    pointOne.yCoor = 7.0;
    System.out.println("Java Properties: " + pointOne.xCoor);
    System.out.println("Java Properties: " + pointOne.yCoor);

如您所知,以Point pointOne = ..;开头的前三行是"Java"的做事方式。您可以看到 getter 采用 print 语句的形式,而 setter 则采用 .setCoor(..) 的形式。

现在,我的问题是,在 Java 中(我刚刚学会了) - 您还可以通过类似属性的声明通过 pointOne.xCoor = .. 设置私有变量,当然,通过与 pointOne.xCoor 相同的方式获取它们。

我知道与 C# 的方式存在这种差异,因为可以手动声明属性的名称,就像这样(如果是 C#)。

public string XCoor
{
    get { return this.xCoor; }
    set { xCoor = value; }
}

有人可以帮助我理解 Java 处理属性的方式和 C# 方式之间的区别吗?

关于Java“属性”和C#属性之间的区别

在 java 中,如果没有公共 getter 和 setter 方法,则无法从另一个类设置私有字段。没有 getter 和 setter 方法的私有字段只能在同一类中设置和查看。

例如

public class A {
    private int a;
    private int b;
    private int c;
    public int s;
    public A(){
        a=5; // In same class
        b=3; // In same class
        c=7;
        s=9;
    }
    public int sum(){
        return a+b; // I can access a and b directly, because we are in the same class with them.
    }
    public getC(){
        return c; // Other classes can read value of c with this public method
    }
    public setC(int value){
        c=value; // Other classes can set value of c with this public method
    }
}

public class B{
    private A obj = new A(); // 
    public void someMethod(){
        int t = obj.getC(); // this is ok
        int g = obj.s; // this is ok because s is public
        int f = obj.c // compiler error, c is private, i can't see it from another class directly
        int p = obj.a // compiler error, a is private, i can't see it from another class directly
    }
}

现在,我的问题是,在Java中(我刚刚学会了) - 你也可以通过pointOne.xCoor = ..通过类似属性的声明来设置私有变量,当然,通过与pointOne.xCoor相同的方式获取它们。

不同之处在于,如果你想在设置xCoor时发生一些特殊的行为,那么在 Java 中是不可能的,除非你确保人们总是通过"getter"和"setter"方法访问这个字段:

point.setXCoor(1);

在 C# 中,只需更改属性的实现:

public string XCoor
{
    get { return this.xCoor; }
    set { 
       if(value < 0) 
           throw new Exception("Negative values not allowed");
       xCoor = value; 
    }
}

另一种说法是,C# 属性只是"getXxx()"和"setXxx()"方法的"语法糖",这使您可以避免经常键入"get"和"set"。"自动属性"(get; set;)只是语法糖,以避免为这些getter和setter方法创建自己的自定义实现。在后台,编译器实际上是在为您创建一个私有字段,就像您在 Java 类上为字段编写 get 和 set 方法时为自己所做的那样。

Java 没有属性。将 Java 的 getter 和 setter 视为 C# 的等价物
酒店的getter和setter。将Java的领域视为相当于C#的
田。C# 允许您在不显式指定
的情况下声明属性的事实该字段,并不意味着该字段在 C# 中不存在。如果我记得不错,在以前的
C# 版本,您必须显式声明字段(因此,如果您有属性
X你通常会有一个支持字段,比如_x)。另请注意,在 C# 中它是
使用getXsetX等方法并不常见(只是因为您可以执行
通过属性X的getter和setter相同)。如果你使用这样的方法,它会得到
很明显,您是从Java进入C#的:)