属性(无额外处理)与公共字段

23 浏览
0 Comments

属性(无额外处理)与公共字段

每当涉及到属性的可信度问题时,我注意到大部分讨论都集中在函数/方法与属性之间的比较上。但我还想知道使用带有关联私有字段的属性相对于直接使用公共字段的令人信服的理由,尤其是在大多数常见的获取/设置行为中没有其他处理的情况下,我的意思是这样的方式:\npublic string CustomerName;\n与\n

private string customerName;
public string CustomerName
{
get{return customerName;}
set(string value){this.customerName=value;}
}

0
0 Comments

(Property(with no extra processing) vs public field)这个问题的出现的原因是Java语言中的一个bug。在许多其他语言(如Python、Delphi、Groovy)中,编译器会自动生成getter和setter方法,除非你提供了这些代码。

这意味着你可以在Groovy中使用一个"public"字段,并且编译器会自动生成和调用setter和getter方法。如果你需要在字段被更改时执行其他操作,你可以引入一个专门的setter方法,一切都将正常工作。

这是现实与设计之间的冲突之一。Java的设计者不希望编译器做任何你看不到的事情。多年前看起来是一个好主意的东西,结果并不太好。

解决这个问题的方法是在Java中手动编写getter和setter方法,而不是直接使用公共字段。这样一来,你可以在getter和setter中添加任何你想要的额外操作。

下面是一个示例,展示了如何在Java中手动编写getter和setter方法:

public class MyClass {
    private String myProperty;
    public String getMyProperty() {
        return myProperty;
    }
    public void setMyProperty(String value) {
        // 可以在这里添加额外的操作
        myProperty = value;
    }
}

以上就是(Property(with no extra processing) vs public field)这个问题的原因和解决方法。通过手动编写getter和setter方法,我们可以在Java中实现与其他语言类似的功能。

0
0 Comments

问题出现的原因是:

1. 可以在派生类中重写或至少创建一个“新”的属性;

2. 现在人们期望属性被公开,而字段被隐藏。如果有人要反射你的类(使用像Castle Windsor、NHibernate这样的工具变得越来越常见),这里有很大的区别,他们可能不会检查公开的字段。

解决方法:

- 在需要被派生类重写的成员上使用属性;

- 使用属性而不是公开的字段,以便反射工具可以正确地访问和操作它们。

下面是一个示例代码,演示了如何使用属性和公开字段:

public class MyClass
{
    private int myField;
    
    public int MyProperty { get; set; }
    
    public int MyField
    {
        get { return myField; }
        set { myField = value; }
    }
}
public class DerivedClass : MyClass
{
    public new int MyProperty { get; set; }
}
public class Program
{
    public static void Main(string[] args)
    {
        MyClass myObject = new MyClass();
        myObject.MyProperty = 5;
        myObject.MyField = 10;
        
        DerivedClass derivedObject = new DerivedClass();
        derivedObject.MyProperty = 15;
        derivedObject.MyField = 20;
        
        Console.WriteLine("MyProperty: " + myObject.MyProperty);
        Console.WriteLine("MyField: " + myObject.MyField);
        Console.WriteLine("DerivedClass MyProperty: " + derivedObject.MyProperty);
        Console.WriteLine("DerivedClass MyField: " + derivedObject.MyField);
    }
}

在上面的示例代码中,`MyClass`类有一个通过属性公开的`MyProperty`和一个通过字段公开的`MyField`。`DerivedClass`类继承自`MyClass`类,并创建了一个新的`MyProperty`属性。在`Main`方法中,我们可以看到如何使用属性和字段来访问和修改这些成员的值。

0
0 Comments

在这段内容中,讨论了使用属性(property)和公共字段(public field)的不同。使用属性可以在以后需要添加其他行为时保持源代码和二进制代码的兼容性,可以添加断点,而且在哲学上更加清晰(关注行为,而不是存储机制)。内容中提到了在C#3中可以使用自动属性来简化代码。然后,讨论者提到了如果一个类有30个字段,应该考虑使用更多的封装。通过封装,可以将逻辑上相关的字段分组在不同的类或接口中,并通过继承或组合来使用它们。这样做可以减少代码量,并且可以重用这些字段组合的概念。最后,有人建议在一个问题中讨论语言设计者的意图。

0