Lov*_*pta 46
宾语:
C#中的每个对象都是直接或间接从对象类型派生的.它是编译时变量,需要装箱和拆箱才能进行转换,这会让它变慢.您可以将值类型更改为引用类型,反之亦然.
public void CheckObject()
{
object test = 10;
test = test + 10; // Compile time error
test = "hello"; // No error, Boxing happens here
}
Run Code Online (Sandbox Code Playgroud)
VAR:
它是编译时变量,不需要装箱和拆箱.由于Var是编译时功能,因此所有类型检查仅在编译时完成.Var初始化后,您无法更改存储在其中的类型.
public void CheckVar()
{
var test = 10; // after this line test has become of integer type
test = test + 10; // No error
test = "hello"; // Compile time error as test is an integer type
}
Run Code Online (Sandbox Code Playgroud)
动态:
它是运行时变量,不需要装箱和拆箱.您可以为动态分配和赋值,也可以更改存储在其中的值类型.动态上的所有错误只能在运行时发现.我们还可以说dynamic是一个运行时对象,它可以保存任何类型的数据.
public void CheckDynamic()
{
dynamic test = 10;
test = test + 10; // No error
test = "hello"; // No error, neither compile time nor run time
}
Run Code Online (Sandbox Code Playgroud)
Fel*_*ani 30
一切都是Object
基础类型.每一种类型都会Object
在瞬间继承,一个简单的int
变量就可以装箱了object
.例如:
object a = 10; // int
object b = new Customer(); // customer object
object c = new Product(); // product object
object d = "Jon"; // string
object e = new { Name = "Felipe", Age = 20 }; // anonymous type
Run Code Online (Sandbox Code Playgroud)
它是任何类型的最抽象,它是一个引用类型.如果你想获得真正的类型,你需要unbox
它(使用转换策略,如方法,强制转换等):
object a = "Some Text";
string text = a.ToString();
// call a string method
text = text.ToUpper();
object i = 10; // declared as object but instance of int
int intValue = (int) i; //declare as an int ... typed
Run Code Online (Sandbox Code Playgroud)
Dynamic
是C#中动态方面的实现,它不是强类型的.例如:
dynamic a = new Class();
a.Age = 18;
a.Name = "Jon";
a.Product = new Product();
a.Name; // read a string
a.Age; // read an int
a.Product.Name; // read a property
a.Product.MoveStock(-1); // call a method from Product property.
Run Code Online (Sandbox Code Playgroud)
var
只是C#语言的关键字,它允许您定义类型的任何对象,因为您使用值初始化它,它将从此值确定类型,例如:
var a = 10; // int
var b = 10d; // double
var c = "text"; // string
var p = new Product(); // Product type
Run Code Online (Sandbox Code Playgroud)
编译器将检查您定义的值的类型并将其设置在对象上.
Sel*_*enç 14
1)var
用于隐式类型定义.例如,如果您定义这样的变量:
var number = 123;
Run Code Online (Sandbox Code Playgroud)
编译器根据指定的值推断类型,并在编译时将变量初始化为整数.在这个定义之后你不能string
为你的变量赋值,因为它是一个整数.你不能这样使用var
:
var number;
number = 123;
Run Code Online (Sandbox Code Playgroud)
因为如果使用var
关键字,则必须为变量指定一些内容,以便确定类型.
2)Object
是所有类的基类.在C#
所有类中继承自对象类,因此您可以将所有内容分配给对象.例如:
object str = "bla bla bla...";
str = 234;
str = DateTime.Now;
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为当您执行此装箱/拆箱时会自动执行此操作.与var
关键字相反,您可以object
像这样使用:
object myVariable;
myVariable = "bla bla bla..";
Run Code Online (Sandbox Code Playgroud)
3)dynamic
是一个很酷的功能C# 4.0
,你可以使用,dynamic
如果你不知道你的函数在编译时返回类型.你的类型将被确定run-time
.因此你不能使用智能感知与动态变量.
您可以像这样使用动态:
dynamic myObj = SomeMethod();
myObj.DoSomething();
myObj.Method1();
Run Code Online (Sandbox Code Playgroud)
但是在使用dynamic时必须小心.因为如果你调用一个不存在的方法或属性,你将RuntimeBinderException
在运行时得到一个.
而最后一件事我要提的,dynamic
并且object
可以参数类型,但var
不能.例如,你可以这样做:
public void SomeMethod(dynamic arg1)
Run Code Online (Sandbox Code Playgroud)
但你不能这样做:
public void SomeMethod(var arg1)
Run Code Online (Sandbox Code Playgroud)
因为var
它不是一个类型而是让编译器为你推断类型的语法糖.
小智 7
Object
是所有.net对象派生自的根类.
var
如果你不想写说string x = "a"
,而是写,则用作快捷方式var x = "a"
.它只适用于编译器可以弄清楚你的意思.
dynamic
意味着你对对象的处理只是在运行时得到的(x.StrangeMethod()
即使方法不存在也不会导致编译错误),在与脚本语言交互时很有用.
小智 7
这很简单......
Object是.NET中的基类型.所有其他类型都继承自它.所以对象类型的变量可以包含所有内容.但是应该只在没有其他选择的情况下完成,原因如下:
在读取/写入此变量之前,我们必须完成拆箱/装箱操作,这些操作很昂贵.
编译器无法在编译时进行类型检查,这可能会在运行时导致错误和异常.例如,此代码将成功编译,但在运行时抛出异常:
Run Code Online (Sandbox Code Playgroud)object o = "2"; int i = 1 + (int)o;
Var不是类型,而是编译器从程序上下文中结束变量类型的指令.它需要匿名方法,但也可以在任何地方使用.请注意,您的程序不会变得难以阅读.编译器在编译时做出决定,因此不会对程序效率产生任何影响.
动态 - 是一种特殊类型,编译器在编译时不会对其进行类型检查.CLR在运行时指定类型.这是静态(!)类型,并且在指定变量类型之后,以后不能更改它.我们应该使用这种类型,因为类似的原因只有对象类型没有其他选项:
在运行时有一个添加操作来指定类型 - 这会降低程序效率.
编译器不执行可能在运行时导致错误和异常的类型检查.