在块之外创建一个对象的范围

时间:2012-09-24 06:10:22

标签: c# oop

我们可以在一个块或函数内初始化一个Object(之前没有声明它),这样它也可以在它的块之外使用......?

这里Type2是Type1

的派生类

例如:

if(a==b)
{ Type1 obj = new Type1();}
else
{Type2 obj = new Type2();}

obj.getFunction(); 

我有一个基类USER派生类ADMIN,在登录时必须根据用户的角色创建一个对象,然后使用该对象,这样我每次都不需要检查用户的角色。 (我是新手)

这是可能的吗?

3 个答案:

答案 0 :(得分:5)

为什么不简单地在范围内执行该功能?您无法访问范围之外的变量。 (除非看到Jon Skeet的答案(竞技场上最好的球员步骤)......

if(a==b)
{ 
    TYPE1 obj = new TYPE1();
    obj.function(); 
}
else
{
    TYPE2 obj = new TYPE2();
    obj.function(); 
}

答案 1 :(得分:5)

变量只能是一种或另一种 - 否则编译器将如何知道之后允许的成员访问权限?

如果有一些公共基类型(基类或接口)声明function,那应该是变量的类型:

BaseType obj;
if (a == b)
{
    obj = new Type1();
}
else
{
    obj = new Type2();
}
obj.Function(); // Name fixed to follow conventions

这会更简单:

BaseType obj = a == b ? (BaseType) new Type1() : new Type2();
obj.Function();

如果他们真的不同类型,那么你有效地调用完全独立的方法,那么要么你需要在每个块中声明变量并调用那里的方法,或者如果您使用的是C#4或更高版本,可以使用动态类型:

dynamic obj = a == b ? (dynamic) new Type1() : new Type2();
obj.Function();

你真的应该考虑这是否是一个真正普通的函数,在这种情况下应该在基类型中声明,或者它是否只是巧合你有两个具有相同名称的函数,在这种情况下尝试以相同的方式对待它们是一个坏主意。 (想象一下你重构一种类型来改变方法名称,例如......)

答案 2 :(得分:5)

  

我们可以在块或函数内创建变量(无需声明   之前它也可以在它的块之外使用......?

不,你不能那样做。您必须在块外部定义变量,以便您也可以在外部访问它。