在块之外创建一个Object的范围

Sin*_*Sin 1 c# oop

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

这里Type2是Type1的派生类

例如:

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

obj.getFunction(); 
Run Code Online (Sandbox Code Playgroud)

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

这可能吗??

Joh*_*Woo 5

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

if(a==b)
{ 
    TYPE1 obj = new TYPE1();
    obj.function(); 
}
else
{
    TYPE2 obj = new TYPE2();
    obj.function(); 
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 5

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

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

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

这将更简单:

BaseType obj = a == b ? (BaseType) new Type1() : new Type2();
obj.Function();
Run Code Online (Sandbox Code Playgroud)

如果他们真的不同类型的,所以你有效地调用完全不同的方法,那么无论你需要每个块内声明的变量,并调用该方法存在,或者如果你正在使用C#4或更高版本,你可以使用动态输入:

dynamic obj = a == b ? (dynamic) new Type1() : new Type2();
obj.Function();
Run Code Online (Sandbox Code Playgroud)

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


Hab*_*bib 5

我们可以在一个块或函数内创建一个变量(之前没有声明它),这样它也可以在它的块之外使用......?

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