我们可以在一个块或函数内初始化一个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,必须根据用户登录时创建一个对象,然后使用该对象,以便我不需要每次都检查用户的角色..(我是一个新手)
这可能吗??
为什么不简单地执行范围上的函数?您无法访问范围之外的变量.(除非看到Jon Skeet的答案(竞技场上最好的球员步骤)......)
if(a==b)
{
TYPE1 obj = new TYPE1();
obj.function();
}
else
{
TYPE2 obj = new TYPE2();
obj.function();
}
Run Code Online (Sandbox Code Playgroud)
变量只能是一种或另一种 - 否则编译器将如何知道之后允许的成员访问权限?
如果有一些公共基类型(基类或接口)声明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)
你应该考虑这是否是一个真正常见的函数,在这种情况下它应该在一个基类型中声明,或者你是否有两个具有相同名称的函数只是巧合,在这种情况下试图以同样的方式对待他们是一个坏主意.(想象一下你重构一种类型来改变方法名称,例如......)