Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:通过方法在构造函数中设置属性_C#_Properties_Constructor - Fatal编程技术网

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

C#:通过方法在构造函数中设置属性,c#,properties,constructor,C#,Properties,Constructor,我开始理解C#和OOP,有一个我似乎无法解决的问题。我有一个名为DataSet的类,它应该包含几个属性(以System.Collections.Generic.Dictionary对象的形式)。在类中,我有从数据库加载数据的方法,这些方法应该用于初始化数据集。基本上,当我从Main方法实例化DataSet对象时,我希望它设置所有属性 我的资料如下(略去细节): 公共类数据集 { 公共IDictionary属性1{get;set;}; 公共IDictionary属性2{get;set;}; 公共I

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

我的资料如下(略去细节):

公共类数据集
{
公共IDictionary属性1{get;set;};
公共IDictionary属性2{get;set;};
公共IDicToAnry属性3{get;set;};
公共数据集()
{
Property1=新字典();
Property2=新字典();
Property3=新字典();
//设置属性1
//设置属性2
//设置属性3(仅当属性1已知时才能执行)
}
私有void GetProperty1(/*某物?*/)
{
//从数据库加载数据。
}
专用静态字典GetProperty1替代(数据集)
{
//同样的事情,但静态的,所以需要实例引用。
}
//类似地,对于不动产2和不动产3
}
我想要的是在构造函数中设置属性。我的问题基本上是:

  • 我现在所做的一切是正确的吗
  • 如果是,我应该将我的方法设置为静态(并通过引用方法传递实例),这将要求类DataSet是静态的(及其所有属性),还是有一种方法可以在不设置DataSet静态的情况下执行我正在执行的操作
  • 一个重要的问题是,只有在知道/设置Property1后才能设置Property3。我不知道这是否可能

  • 非常感谢您的帮助。

    您的代码中有一些问题。您已将属性公开,因此也使用GetProperty1没有任何意义。另一种方法是将字典设置为私有变量,这样您就可以:

    public IDictionary<string,MyClass1> GetProperty1()
    {
        if ( _property1 == null )
        {
            _property1 = LoadFromDatabase();
        }
        return _property1;
    }
    
    公共IDictionary GetProperty1() { if(_property1==null) { _property1=LoadFromDatabase(); } 归还财产1; }
    同样,对于property3,您也可以在创建并返回ProeProperty1之前检查ProeProperty1是否不为null,但您还需要决定要执行的操作(首先自动加载属性1,或者为property3返回null)

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

    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;
            }
        }
    
    公共类数据集
    {
    私有数据集()
    {
    }
    公共数据集_实例=null;
    公共静态数据集实例
    {
    获取{if(_instance=null){u instance=new DataSet();}返回_instance;}
    }
    私有IDictionary _property1=null;
    公共索引属性1
    {
    得到
    {
    结果=_属性;
    如果(结果==null)
    {
    //读取数据库
    } 
    返回结果;
    }
    }
    
    为什么不添加一个公共函数,例如LoadData()可以在构建对象后调用。这可以使用正确的顺序加载所有数据。我想你甚至可以在构造函数中调用它。我也会按照Lukos的建议,使用public get属性创建一些私有成员变量。

    我觉得你需要加载字典,然后ant来缓存它。您可以在属性getter中惰性地执行此操作:

    public class DataSet
    {
        private IDictionary<string, MyClass> property;
    
        public IDictionary<string, MyClass> Property
        {
            if (property == null)
            {
                property = LoadProperty();
            }
            return property;
        }
    }
    
    您可以简单地执行以下操作:

    anIntance.Property;
    
    我现在所做的一切是正确的吗

    我想很多人把你的
    Get
    函数混淆为传统的“getter”,所以你应该重新命名它

    如果是,我应该将我的方法设置为静态(并通过引用方法传递实例),这将要求类DataSet是静态的(及其所有属性),还是有一种方法可以在不设置DataSet静态的情况下执行我正在执行的操作

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

    public DataSet()
    {
            Property1 = LoadProperty1();
            Property2 = LoadProperty2();
            Property3 = LoadProperty3();//can only be done when Property1 is known
    }
    
    private static Dictionary<string, MyClass1> LoadProperty1()
    {
        // load data
    }
    
    公共数据集() { Property1=LoadProperty1(); Property2=LoadProperty2(); Property3=LoadProperty3();//仅当Property1已知时才能执行 } 私有静态字典LoadProperty1() { //加载数据 } 一个重要的问题是,只有当Property1已知/设置后才能设置Property3。我不知道这是否可能


    正如您所看到的,这在上面的代码中得到了解决。

    您为什么考虑将
    GetProperty1
    设置为静态?谢谢,Lukos。您所说的“您已将属性公开,因此也使用GetProperty1实际上没有意义”到底是什么意思?我希望属性是公共的,这样我可以在其他代码中访问它们,GetProperty方法应该加载它们。你的方法的优点是什么?延迟加载的思想是只在需要时加载数据。我描述的方法只加载一次数据(如果尚未加载),然后将字典返回给用户。因此,您不需要属性,只需调用此方法即可访问它们。延迟加载并不总是最佳选择,但它可以避免在应用程序每次运行时都加载可能不需要的大量数据。很酷,我不知道这一点!设置属性的延迟或急切方式是否有普遍的偏好?我发现急切加载稍微干净一点,因为您不需要私有备份属性。但是如果(1)您不知道您将需要属性,或者(2)您不希望对象构造花费太多时间,您通常会进行惰性加载。非常好的建议,各位!谢谢。是的,GetProperty方法不是传统的get函数。我将重命名它们(在我的代码中),
    private static Dictionary<string, MyClass1> GetProperty1Alternative(DataSet dataSet)
    
    DataSet.GetProperty1Alternative(anInstance);
    
    anIntance.Property;
    
    public DataSet()
    {
            Property1 = LoadProperty1();
            Property2 = LoadProperty2();
            Property3 = LoadProperty3();//can only be done when Property1 is known
    }
    
    private static Dictionary<string, MyClass1> LoadProperty1()
    {
        // load data
    }