.net c#中static关键字是什么意思,还有,动态方法是哪个关键字,是什么意思了

如题所述

static 表示这个变量或者方法是静态的。静态的变量或者方法是不需要实例化类,就可以访问的。而动态方法,可能就是没加static的,默认就是动态的,呵呵,这样的方法或者成员变量,需要实例化了类之后才可以访问。

至于为什么有静态,那要从程序的内存组织方式上来解释,一个变量或者方法,加不加static关键字,在内存中分配的区域是不一样的。你可以理解为,内存中有2个地方,一个地方存放的是类的模板,静态成员都在这里分配内存。而你要使用类的时候,要new的时候,运行环境会把这个类从静态区拷贝一份出来放到动态区去,没加static关键字的成员,就要到动态的内存区去访问。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-04-16
使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员。static 修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型。

使用 DynamicMethod 类(.NET Framework 2.0 版中的新类)创建的动态方法为在运行时发出静态方法提供了增强的功能。动态方法通过多种方式扩展 Reflection.Emit 命名空间中的类型的功能:

1.因为不需要生成动态程序集、模块和类型以包含方法,所以它们的系统开销较小。

2.在长时间运行的应用程序中,它们可提供更好的资源占用状况,因为方法体使用的内存在无需再使用该方法时可以回收。

3.如果具有足够的安全权限,它们就能够使代码与现有程序集或类型关联,而该代码能够具有与内部类型和私有成员相同的可见性。

4.如果具有足够的安全权限,它们允许代码跳过实时 (JIT) 可见性检查并访问对象的私有的和受保护的数据。

动态方法可以使用 ILGenerator 对象发出 Microsoft 中间语言 (MSIL)。此外,动态方法还可以使用 DynamicILInfo 对象处理元数据标记和允许复杂客户端执行自己的 MSIL 生成的范围。

动态方法对需要生成运行时代码以保证性能的情形十分有用。
using System;
using System.Reflection;
using System.Reflection.Emit;

public class Example
{
// The following constructor and private field are used to
// demonstrate a method bound to an object.
private int test;
public Example(int test) { this.test = test; }

// Declare delegates that can be used to execute the completed
// SquareIt dynamic method. The OneParameter delegate can be
// used to execute any method with one parameter and a return
// value, or a method with two parameters and a return value
// if the delegate is bound to an object.
//
private delegate long SquareItInvoker(int input);

private delegate TReturn OneParameter<TReturn, TParameter0>
(TParameter0 p0);

public static void Main()
{
// Example 1: A simple dynamic method.
//
// Create an array that specifies the parameter types for the
// dynamic method. In this example the only parameter is an
// int, so the array has only one element.
//
Type[] methodArgs = { typeof(int) };

// Create a DynamicMethod. In this example the method is
// named SquareIt. It is not necessary to give dynamic
// methods names. They cannot be invoked by name, and two
// dynamic methods can have the same name. However, the
// name appears in calls stacks and can be useful for
// debugging.
//
// In this example the return type of the dynamic method
// is long. The method is associated with the module that
// contains the Example class. Any loaded module could be
// specified. The dynamic method is like a module-level
// static method.
//
DynamicMethod squareIt = new DynamicMethod(
"SquareIt",
typeof(long),
methodArgs,
typeof(Example).Module);

// Emit the method body. In this example ILGenerator is used
// to emit the MSIL. DynamicMethod has an associated type
// DynamicILInfo that can be used in conjunction with
// unmanaged code generators.
//
// The MSIL loads the argument, which is an int, onto the
// stack, converts the int to a long, duplicates the top
// item on the stack, and multiplies the top two items on the
// stack. This leaves the squared number on the stack, and
// all the method has to do is return.
//
ILGenerator il = squareIt.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Conv_I8);
il.Emit(OpCodes.Dup);
il.Emit(OpCodes.Mul);
il.Emit(OpCodes.Ret);

// Create a delegate that represents the dynamic method.
// Creating the delegate completes the method, and any further
// attempts to change the method (for example, by adding more
// MSIL) are ignored. The following code uses a generic
// delegate that can produce delegate types matching any
// single-parameter method that has a return type.
//
OneParameter<long, int> invokeSquareIt =
(OneParameter<long, int>)
squareIt.CreateDelegate(typeof(OneParameter<long, int>));

Console.WriteLine("123456789 squared = {0}",
invokeSquareIt(123456789));

// Example 2: A dynamic method bound to an instance.
//
// Create an array that specifies the parameter types for a
// dynamic method. If the delegate representing the method
// is to be bound to an object, the first parameter must
// match the type the delegate is bound to. In the following
// code the bound instance is of the Example class.
//
Type[] methodArgs2 = { typeof(Example), typeof(int) };

// Create a DynamicMethod. In this example the method has no
// name. The return type of the method is int. The method
// has access to the protected and private data of the
// Example class.
//
DynamicMethod multiplyHidden = new DynamicMethod(
"",
typeof(int),
methodArgs2,
typeof(Example));

// Emit the method body. In this example ILGenerator is used
// to emit the MSIL. DynamicMethod has an associated type
// DynamicILInfo that can be used in conjunction with
// unmanaged code generators.
//
// The MSIL loads the first argument, which is an instance of
// the Example class, and uses it to load the value of a
// private instance field of type int. The second argument is
// loaded, and the two numbers are multiplied. If the result
// is larger than int, the value is truncated and the most
// significant bits are discarded. The method returns, with
// the return value on the stack.
//
ILGenerator ilMH = multiplyHidden.GetILGenerator();
ilMH.Emit(OpCodes.Ldarg_0);

FieldInfo testInfo = typeof(Example).GetField("test",
BindingFlags.NonPublic | BindingFlags.Instance);

ilMH.Emit(OpCodes.Ldfld, testInfo);
ilMH.Emit(OpCodes.Ldarg_1);
ilMH.Emit(OpCodes.Mul);
ilMH.Emit(OpCodes.Ret);

// Create a delegate that represents the dynamic method.
// Creating the delegate completes the method, and any further
// attempts to change the method for example, by adding more
// MSIL are ignored.
//
// The following code binds the method to a new instance
// of the Example class whose private test field is set to 42.
// That is, each time the delegate is invoked the instance of
// Example is passed to the first parameter of the method.
//
// The delegate OneParameter is used, because the first
// parameter of the method receives the instance of Example.
// When the delegate is invoked, only the second parameter is
// required.
//
OneParameter<int, int> invoke = (OneParameter<int, int>)
multiplyHidden.CreateDelegate(
typeof(OneParameter<int, int>),
new Example(42)
);

Console.WriteLine("3 * test = {0}", invoke(3));
}
}
/* This code example produces the following output:

123456789 squared = 15241578750190521
3 * test = 126
*/

参考资料:vs2005

第2个回答  2010-04-16
声明 类或者变量为静态

类的话,在引用的时候不需要实例化,里面的属性方法等可以直接.出来

附值后.值会一直存在于程序的运行周期,除非主动去更新这些值,否则值不变本回答被提问者采纳
第3个回答  2010-04-16
说简单点就是:如果你定义的类存在static,那么在调用你自己定义的类的时候就不需要实例化的!

.net c#中static关键字是什么意思,还有,动态方法是哪个关键字,是什么...
static 表示这个变量或者方法是静态的。静态的变量或者方法是不需要实例化类,就可以访问的。而动态方法,可能就是没加static的,默认就是动态的,呵呵,这样的方法或者成员变量,需要实例化了类之后才可以访问。至于为什么有静态,那要从程序的内存组织方式上来解释,一个变量或者方法,加不加static关键字,...

在C#中static关键字是什么意思?
1.在static void Main(string[] args)里用到的所有不在函数域里的变量都需要设置成static 2.有的类中将变量(即定义一个“域”)或者方法定义为static类型,那么这个变量字段(或者方法)可以形象的理解为是“类”的(即,该类的所有成员共享内存中为a分配的一块内存空间),而不像其他普通的变量(...

C#中static关键字的作用
1.static意思是静态,可以修饰类、字段、属性、方法 2.标记为static的就不用创建实例对象调用了,可以通过类名直接点出来 3.static三种用法:4.用于变量前,表示每次重新使用该变量所在方法、类或自定义类时,变量的值为程序这次运行最后一次为变量赋值时的值,这个方法称为静态函数:private void s(){...

c#中static的意思是什么?
static 用来说明静态变量。1、如果是在函数外面定义的,那么其效果和全局变量类似,即static说明的变量可以在当前c程序文件中使用。2、如果是在函数内部定义的,那么这个变量只初始化一次,即使再次调用这个函数,这个static变量也不会再次被初始化,于是,这个变量的取值就会一直保存着,我们再次调用该函数时...

java和c# 语言关键字都是什么?
java关键字 1.break和continue break和continue是两个java关键字,在一个循环中,比如50次的循环语句中,如果在某次循环中执行了break语句,那么整个循环语句就结束。 如果在某次循环中执行了continue语句,那么本次循环就结束,即不再执行本次循环中循环体中continue语句后面的语句,而转入进行下一次循环。2.static关键字 ...

c#中 在学习面向对象时候 在定义类的时候 static前面加上一个public 有...
类可以声明为 static,指示它仅包含静态成员。不能使用 new 关键字创建静态类的实例。静态类在加载包含该类的程序或命名空间时由 .NET Framework 公共语言运行库 (CLR) 自动加载。使用静态类来包含不与特定对象关联的方法。例如,创建一组不操作实例数据并且不与代码中的特定对象关联的方法是很常见的要求...

C#中静态方法是什么意思?静态成员呢?还有静态类?
其中静态字段需要使用关键字static:例如: static int Total ;静态成员属于类,所以要用“类名.静态字段”的样式 int i=200;sqrt.Total=i;c#中当然还有其他静态成员,例如静态方法!!!在此强调一点,静态方法只能直接访问静态类!静态类:它任然具有对象的抽象性,类可以声明为 static 的,以指示它...

c#中的静态表示什么?
static: 类变量(对象共享)可以用类名,对象名点取,间接使用。 类方法 1)static方法中不能直接使用非静态成员, 因为非静态成员与实例相关,通过对象点取间接使用 2)static方法中不能用this(与实例相关)3)非static方法中可以使用static成员 静态方法有什么弊端?问:我翻看一些源码工程时看到几乎没...

关于C#中的静态构造函数和静态成员
static void Main(string[] args){ Console.WriteLine(A.i);Console.ReadLine();} }的打印结果为 静态 100()说明了第三点 4、静态构造器在任何类的实例变量被分配前执行 class A { public static int i=100;static A(){ Console.WriteLine("静态");} public A(){ Console.WriteLine("动态...

在C#中什么是静态方法,,实例方法?
Oh,My God!你会重新向往面向过程的程序设计方法,向往拥有全局变量的时代。但,这种局面不会出现,因为C#中为你准备好了另外一种变量类型:静态变量。它在类中类似全局变量,保存类的公共信息,所有该类的实例(对象)共享该值。静态变量的声明方式如下:[访问修饰符] static 数据类型 变量名;这里的访问...

相似回答