C# 使对象的范围超出块

C# 使对象的范围超出块,c#,oop,C#,Oop,我们可以在块或函数内部初始化一个对象而不声明它,这样它也可以在块外部使用吗 这里,Type2是Type1的派生类 例如: if(a==b) { Type1 obj = new Type1();} else {Type2 obj = new Type2();} obj.getFunction(); 我有一个基类用户派生类ADMIN,必须在用户登录时根据用户的角色创建一个对象,然后使用该对象,这样我就不需要每次都检查用户的角色。。我是个新手 这有可能吗???为什么不简单地在作用域上执行函数呢?

我们可以在块或函数内部初始化一个对象而不声明它,这样它也可以在块外部使用吗

这里,Type2是Type1的派生类

例如:

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

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


这有可能吗???

为什么不简单地在作用域上执行函数呢?无法访问超出范围的变量。除非看到乔恩·斯基特的答案,否则最好的球员会站在竞技场上


为什么不简单地在作用域上执行函数呢?无法访问超出范围的变量。除非看到乔恩·斯基特的答案,否则最好的球员会站在竞技场上


变量只能是一种或另一种类型,否则编译器如何知道以后允许哪些成员访问

如果存在声明函数的公共基类型基类或接口,则应为变量的类型:

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();
如果它们确实是不同的类型,因此您实际上是在调用完全不同的方法,那么您需要在每个块中声明变量并在那里调用该方法,或者如果您使用的是C4或更高版本,则可以使用动态类型:

dynamic obj = a == b ? (dynamic) new Type1() : new Type2();
obj.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();
如果它们确实是不同的类型,因此您实际上是在调用完全不同的方法,那么您需要在每个块中声明变量并在那里调用该方法,或者如果您使用的是C4或更高版本,则可以使用动态类型:

dynamic obj = a == b ? (dynamic) new Type1() : new Type2();
obj.Function();
您应该认真考虑这是否是一个真正常见的函数,在这种情况下,它应该在基类型中声明,或者这是否只是一个巧合,您有两个同名的函数,在这种情况下,尝试以相同的方式处理它们是一个坏主意。假设您重构一种类型以更改方法名称,例如

我们可以在块或函数中创建变量而不声明 它之前,以便它可以使用以外的块太

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

我们可以在块或函数中创建变量而不声明 它之前,以便它可以使用以外的块太


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

你是说Type1和Type2应该从BaseType继承吗???@Hybridzz:可能是的。你没有给我们足够的信息,我有一个基类用户和派生类管理员,必须根据角色创建一个对象。ie;如果role是1,那么我必须创建一个ADMIN对象,比如obj,否则我必须创建一个名为obj的USER类型的对象;如果角色==1{obj=new ADMIN;}否则{obj=new USER;}obj.getDetails@Hybridzz:对不起,如果你拒绝按要求提供问题的细节,而只是在评论中提供一些信息,我帮不了你。你的意思是Type1和Type2应该从BaseType继承吗???@Hybridzz:可能是的。你没有给我们足够的信息,我有一个基类用户和派生类管理员,必须根据角色创建一个对象。ie;如果role是1,那么我必须创建一个ADMIN对象,比如obj,否则我必须创建一个名为obj的USER类型的对象;如果角色==1{obj=new ADMIN;}否则{obj=new USER;}obj.getDetails@Hybridzz:对不起,如果你拒绝按要求提供问题的细节,而只是在评论中提供一些信息,我帮不了你。@Hybridzz:你为什么要在事后使用它?基本上,你没有给我们提供足够的情况信息。请阅读@Hybridzz:为什么你必须在事后使用它?基本上,你没有给我们提供足够的情况信息。请阅读好的,我需要知道这是什么可能的一些方法。谢谢你answer@Hybridzz,您必须在块外定义变量才能在以后使用它,就是这样。好的,我需要知道这是什么
可能有一些方法。谢谢你answer@Hybridzz,您必须在块外定义变量才能在以后使用它,就是这样。否则就不可能了。