关于Java“Properties”和C#'Properties之间的区别

时间:2014-04-06 21:49:21

标签: c# java properties setter getter

作为实习的一部分,我在C#工作了六个月。我在实习中学到的东西是C#属性,AKA setter和getter的美妙之处。在实习开始时,属性也是我困惑的根源,但使用它一段时间后,我爱上了它。

回到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"做事的方式。您可以看到以print语句形式出现的getter,以及.setCoor(..)形式的setter。

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

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

pointOne.xCoor

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

3 个答案:

答案 0 :(得分:2)

  

现在,我的问题是,在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方法一样。

答案 1 :(得分:2)

在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
    }
}

答案 2 :(得分:1)

Java没有属性。将Java的getter和setter视为C#的等价物 该物业的吸气剂和二传手。将Java的字段视为C#的等价物 领域。事实上,C#允许您声明属性而不明确指定
该字段,并不意味着C#中没有该字段。如果我记得很清楚,在之前的中  C#的版本你必须明确声明字段(所以如果你有一个属性
X您通常会有一个支持字段_x)。另请注意,在C#中它是
不常见getXsetX等方法(因为你可以做到这一点 同样通过属性X的getter和setter)。如果你使用这样的方法,它会得到 很明显你从Java进入C#:)