Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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#_Asp.net_Oop_C# 4.0 - Fatal编程技术网

C# 存储预定义对象

C# 存储预定义对象,c#,asp.net,oop,c#-4.0,C#,Asp.net,Oop,C# 4.0,我使用嵌套在静态类中的预定义对象在单个位置存储对象信息,然后在一些逻辑之后使用它们用预定义对象的属性填充普通对象 你认为这种方法很好,或者我可以通过其他更有效、更好的方法实现同样的效果,你会怎么说 //Example of storing predefined objects public static class RegistrationGift { public class InvitedRegistrationGift {

我使用嵌套在静态类中的预定义对象在单个位置存储对象信息,然后在一些逻辑之后使用它们用预定义对象的属性填充普通对象

你认为这种方法很好,或者我可以通过其他更有效、更好的方法实现同样的效果,你会怎么说

//Example of storing predefined objects

 public static class RegistrationGift
    {
        public class InvitedRegistrationGift
        {
            public const int Token = 5;
            public const int Dollar = 0;

        }
    }

//how it will be used to populate credit entity (conversion)

Credit credit = new Credit();
credit.Token = RegistrationGift.InvitedRegistrationGift.Token;  

// and so on

这与面向对象的设计模式(称为。由于您使用的是C#,您可能希望让您的
Credit
对象实现
iclonable
接口,并返回您定义的原型对象的克隆以填充Credit条目。

这似乎是一个更适合抽象的场景

根据实现的不同,我会这样做:

abstract class Credit
{
   protected int Token; 
   protected int Dollar;
}

class InvitedRegistrationGift : Credit
{
   public override int Token
   {
       get 
       {
           return 5;
       }
   }
}

Credit credit = new InvitedRegistrationGift();

使用静态类不会带来重大问题,但是单例模式可能更适合这种情况

public class RegistrationConfig {
   // private static instance
   private static RegistrationConfig _instance = new RegistrationConfig()

   // private constructor prevents the class from being instantiated from outside
   private RegistrationConfig() { }

   // instance public accessor
   public static RegistrationConfig Current { get { return _instance; } }

   public int InvitationToken { get; set; }
   public int InvitationDollar { get;set; }
}
消费:

var credit = new Credit();
credit.Token = RegistrationConfig.Current.InvitationToken;
其变体不是实现singleton模式,而是保留.Current访问器并定义公共setter,这样您就可以更改活动配置

public class RegistrationConfig {
   // current
   private static RegistrationConfig _current;

   // instance public accessor
   public static RegistrationConfig Current { get { return _current; } }

   // public setter
   public static void SetCurrent(RegistrationConfig current)
   {
       _current = current;
   }

   public int InvitationToken { get; set; }
   public int InvitationDollar { get;set; }
}
然后,在应用程序启动时设置配置

RegistrationConfig.SetCurrent(new RegistrationConfig() { ... });
和消费:

credit.Token = RegistrationConfig.Current.InvitationToken;

优点是可以使用预定义的值创建实例​​例如,在单元测试中使用。

我说这很奇怪。我不明白。重点是什么?为什么不简单地创建一个invitedRegistrationIFT实例呢?目的是只在一个地方存储invitedRegistrationIFT,将来每当我需要更改(比如令牌)时,我都可以在一个地方进行更改。但是你对整个asp.net应用程序只有一个礼物?是的。好吧,假设我在多个位置使用它,那么我需要去每个位置并更新它。通过使用这种方法,我只需要在一个地方进行更改,好的,那么您使用静态类作为配置存储?假设您的令牌是“xyz”,那么一段时间后它将更改为“cxd”。然后使用invitedRegistrationIFT存储有关令牌的一些配置,但令牌对应用程序本身有效,而对用户无效。。。好吧,好吧……我倾向于抽象,因为看起来他需要强制引用值,这在基于接口的继承中是不可能的。