2010-07-30 149 views
7

在C#中,是否可以在不使用参数传递的情况下通过不同类中的静态方法访问实例变量?是否可以通过静态方法访问实例变量?

在我们的项目中,我有一个Data access layer类,它有很多静态方法。在这些方法中,SqlCommand超时值已被硬编码。在我们的框架中的另一个类(Dac)中有许多实例方法调用这些静态方法。

我不想使用参数传递编码太多。你有没有比参数传递更容易的其他解决方案?

+0

静态方法不与任何实例,这样你怎么能指望它来了解相关的哪个实例访问会员? – 2010-07-30 13:38:12

+0

哪个实例? – 2010-07-30 13:38:24

回答

11

是的,可以在不使用参数的情况下从静态方法访问实例变量,但前提是您可以通过声明为静态的东西来访问它。例如:

public class AnotherClass 
{ 
    public int InstanceVariable = 42; 
} 

public class Program 
{ 
    static AnotherClass x = new AnotherClass(); // This is static. 

    static void Main(string[] args) 
    { 
     Console.WriteLine(x.InstanceVariable); 
    } 
} 
+4

+1,但哦[全局变量的恐怖](http://c2.com/cgi/wiki?GlobalVariablesAreBad)! – 2010-07-30 14:02:51

+0

是的...带来童年噩梦的回忆! – 2010-07-30 14:47:51

5

当然,您可以将一个实例作为参数传递给该方法。像:

public static void DoSomething(Button b) 
{ 
    b.Text = "foo"; 
} 

但是,它不可能得到任何实例变量,否则。

+0

感谢杰克,但我改变了这个问题。 – mkus 2010-07-30 13:27:15

6

静态方法没有实例可以使用,所以没有。没有参数传递是不可能的。

另一种选择可能是使用类的静态实例(Mark的示例在工作中显示此方法),尽管从您的示例中我不确定这会解决您的问题。

个人而言,我认为参数传递将是最好的选择。我仍然不确定为什么你想避开它。

+0

贾斯汀,我为你的兴趣编辑了我的问题。 – mkus 2010-07-30 13:38:57

+1

编辑归结为“我不想”,这不是一个很好的技术原因。如果不是不可能的话,替代方案真的很糟糕。 – siride 2010-07-30 14:33:02

1

不,你不能。

如果你想访问一个实例变量,那么你的方法根据定义不应该是静态的。

+0

访问单例实例属性如何? – 2010-07-30 13:47:02

+1

@Richard:对于单例,你有一个实例,在这种情况下方法不会是静态的。只有获取单例实例的方法是静态的。 – 2010-07-30 14:57:13

2

是的,只要它有一个范围内的对象的实例。 单身的情况下,或方法本身中创建的对象..

举例来说,一种常见的场景:

public static string UserName 
{ 
    return System.Web.HttpContext.Current.User.Identity.Name; 
} 
相关问题