2015-07-21 112 views
-1

我有属性:为什么私有静态属性为

private static string ConnCms = ConnectionStrings.ConnCms; 
private static string ConnSite = ConnectionStrings.ConnSite; 

为什么,当我打电话SetTargetDB()ConnCmsConnSitenull
我也试图把ConnCms一个字符串,如“布拉布拉”和值仍是null

private void SetTargetDB(TargetDB value) 
{ 
    switch (value) 
    { 
     case TargetDB.MainDB: 
      connectionString = ConnectionStrings.isCms? ConnCms : ConnCms2 ; 
      break; 
     case TargetDB.UsersMaariv: 
      connectionString = ConnUser; 
      break; 
     case TargetDB.JpostUsers: 
      connectionString = ConnUser; 
      break; 
    } 
} 

这可能是很重要的数据,以帮助您帮我:
我有这个类的(单班)

私有静态NewDBAccess实例=新NewDBAccess(XXX)仅私有实例;

+3

'ConnectionStrings.ConnCms'中的代码是什么?它必须是这个代码返回'null' –

+1

'ConnectionStrings.ConnCms'最初可能在静态字符串ConnCms被初始化时返回null。这个值很可能稍后设置。 –

+0

“ConnectionStrings”是否存在于正在执行的应用程序的配置文件中,或存储在别的地方,即另一个库?它们必须存在于调用此代码的程序集中。 – Ric

回答

0

请记住,静态成员报关/实例化,构造函数总是先天下之忧锻炼。所以,除非ConnectionStrings.ConnCms和ConnectionStrings.ConnSite是静态的属性和他们已经实例化这是非常合乎逻辑的,他们没有时加载。这就是为什么你得到null值。

你可以把它分成两个部分。在第一部分中声明你的静态成员。稍后在您的代码中为它们分配值。

private static string ConnSite; 
private static string ConnCms; 

private void SetTargetDB(TargetDB value) 
{ 
    ConnCms = ConnectionStrings.ConnCms; 
    ConnSite = = ConnectionStrings.ConnSite; 
    switch (value) 
    { 
     case TargetDB.MainDB: 
      connectionString = ConnectionStrings.isCms? ConnCms : ConnCms2 ; 
      break; 
     case TargetDB.UsersMaariv: 
      connectionString = ConnUser; 
      break; 
     case TargetDB.JpostUsers: 
      connectionString = ConnUser; 
      break; 
    } 
} 

但是,您的问题提供的信息太少,无法弄清楚发生了什么以及为什么。添加一些额外的信息...

0

ConnectionStrings.ConnCms最有可能的时候static string ConnCms初始化返回null。这个值很可能稍后设置。

+0

虽然技术上正确,但这并不能真正帮助OP,因为它不能解决问题。我会留下一条评论,要求澄清。 – CodeCaster

+0

通常,当有人了解问题时,他可以轻松解决问题(或不那么容易,但独立)。 –

+0

是的,但是SO的目的是在你的答案中解决问题,而不是说明显。调试提示进入评论,解决方案进入答案。如果OP不想合作澄清问题,请不要回答。 – CodeCaster

0

假设ConnectionStringsstructclass,你需要把它放在被称为绝对第一(其他一切需要的基础设施后)的代码块。例如,通常在Visual Studio中,将有一个文档注释它上面的一个类的方法说像

namespace YourAppNS { 

    public partial class MainWindow : Window { 
     // Constructor for MainWindow Class 
     public MainWindow() { 
      InitializeComponent(); 
      /** This is where you want to place any initializers 
       to the variables (e.g. ConnectionStrings) in order 
       to have them be non-null when called. Again, depending 
       on your implementation, you may need ConnectionStrings 
       object to be either public, protected internal, or 
       global. Again, other than mentioning this is a singleton 
       class...are all of the methods contained inside also? */ 
     } 
    } 
} 

C#从我选择的编程语言的某些方面有很大的不同 - C和C++ - 之一这些差异在于缺少能够定义常量#define预处理器宏或者真正不变的,不可变的&静态对象在应用程序开始时初始化。虽然这是可以做到(有点)通过一些相当复杂和麻烦的黑客...做的最好的事情是寻找到你的代码将首先开始执行的区域。然后调用需要初始化的方法,以便它们包含有效的数据。

此外,请确保ConnectionStrings对象上具有正确的访问说明符(例如public,protected internal等)。如果它是一个结构体,根据代码的具体情况,您可能需要确保结构中的每个项目都是,也是分类为公共的。或者用{get;组; }与简单的静态声明。

我希望这对我有所帮助,我打算让这是对您的消息的评论,但它与我在学习c#时遇到的问题类似。如果你可以提供一些关于对象类型的更多细节,你如何给它们打电话等,也许我们可以帮助更多!

祝你好运。

相关问题