通过方法在构造函数中设置属性

本文关键字:设置 属性 构造函数 方法 | 更新日期: 2023-09-27 18:16:04

我开始了解c#和OOP,并且有一个我似乎无法解决的问题。我有一个叫做DataSet的类,它应该包含几个属性(以System.Collections.Generic.Dictionary对象的形式)。在类中,我有从数据库加载数据的方法,这些方法应该用于初始化DataSet。基本上,我希望DataSet对象设置所有属性,当我从Main方法实例化它时。

我所拥有的是以下内容(省略细节):

public class DataSet
{
    public IDictionary<string, MyClass1> Property1 { get; set; };
    public IDictionary<string, MyClass2> Property2 { get; set; };
    public IDictioanry<string, MyClass3> Property3 { get; set; };
    public DataSet()
    {
            Property1 = new Dictionary<string, MyClass1>();
            Property2 = new Dictionary<string, MyClass2>();
            Property3 = new Dictionary<string, MyClass3>();
        // Set Property1
        // Set Property2
        // Set Property3 (can only be done when Property1 is known)
    }
    private void GetProperty1(/* something? */)
    {
        // Loads the data from a database.
    }
    private static Dictionary<string, MyClass1> GetProperty1Alternative(DataSet dataSet)
    {
        // Same thing but static, so needs instance ref.
    }
    // Similarly for Property2 and Property3
}

我想要的是在构造函数中设置属性。我的问题基本上是:

  1. 我所做的一切都是正确的吗?
  2. 如果是,我应该使我的方法静态(并通过引用的方法传递实例),这将要求类数据集是静态的(和它的所有属性),或者有一种方法来做我正在做的事情没有使数据集静态?
  3. 一个重要的问题是Property3只能在Property1已知/设置后设置。我不知道这是否可能…

通过方法在构造函数中设置属性

您的代码中有几个问题。你已经把属性设为公共的,所以也有GetProperty1没有意义。另一种方法是将字典设为私有变量,这样就可以有:

public IDictionary<string,MyClass1> GetProperty1()
{
    if ( _property1 == null )
    {
        _property1 = LoadFromDatabase();
    }
    return _property1;
}

同样对于property3,您也可以在创建和返回property1之前检查它是否为null,但是您还需要决定要做什么(自动首先加载property 1或为property3返回null)

我所做的是正确的方法吗?

你没那么离谱。我想很多人都把你的Get函数和传统的"getter"混淆了,所以你应该重命名它。

如果是,我应该使我的方法静态(并通过引用的方法传递实例),这将要求类数据集是静态的(和它的所有属性),或者有一种方法来做我正在做的事情没有使数据集静态?

您可以使方法实际加载数据为静态,并且您不需要传递实例—您可以只返回数据。(我已经改变了函数名)。从实例/构造函数调用静态方法是可以的,但反过来就不行。

public DataSet()
{
        Property1 = LoadProperty1();
        Property2 = LoadProperty2();
        Property3 = LoadProperty3();//can only be done when Property1 is known
}
private static Dictionary<string, MyClass1> LoadProperty1()
{
    // load data
}

一个重要的问题是Property3只能在Property1已知/设置后才能设置。我不知道这是否可能。

如您所见,这在上面的代码中解决了。

您可以使用以下代码。它可以解决你的几个问题。

public class DataSet
{
    private DataSet()
    {
    }
    public DataSet _instance = null;
    public static DataSet Instance
    {
       get{ if (_instance = null){_instance = new DataSet();}return _instance;}
    }

    private IDictionary<string, MyClass1> _property1 = null;
    public IDictionary<string, MyClass1> Property1
    {
        get
        {
           result = _property;
           if (result == null)
           {
             //read database
           } 
           return result;
        }
    }

为什么不添加一个公共函数,例如LoadData(),可以在你的对象被构造后调用。这可以以正确的顺序加载所有数据。我想你甚至可以在构造函数中调用它。我也会遵循Lukos的建议,让一些私有成员变量具有公共get属性。

在我看来,你需要加载你的字典,然后要缓存它。你可以在属性getter中惰性地做到这一点:

public class DataSet
{
    private IDictionary<string, MyClass> property;
    public IDictionary<string, MyClass> Property
    {
        if (property == null)
        {
            property = LoadProperty();
        }
        return property;
    }
}

或在构造函数中急切地:

public class DataSet
{
    public IDictionary<string, MyClass1> Property { get; private set; }    
    public DataSet()
    {
        Property = LoadProperty();
    }
}

同样,使用这个方法也没有多大意义:

private static Dictionary<string, MyClass1> GetProperty1Alternative(DataSet dataSet)

不像这样调用它:

DataSet.GetProperty1Alternative(anInstance);

你可以简单地这样做:

anIntance.Property;