C#中的static方法
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespacedelegent{classP...
using System;
using System.Collections.Generic;
using System.Text;
namespace delegent
{
class Program
{
public delegate void Greetdelegent(string name);
public static void EnglishGreet(string name)
{
Console.WriteLine("hellow," + name + "!");
}
public static void ChineseGreet(string name)
{
Console.WriteLine("heelow," + name + "!");
}
public static void GreetMaker(string name, Greetdelegent delegentmethod)
{
delegentmethod(name);
}
static void Main(string[] args)
{
GreetMaker("Lily", EnglishGreet);
GreetMaker("刘兵", ChineseGreet);
Console.ReadLine();
}
}
}
//////////////////////////////////////
以上是我写的一个关于委托的小程序,但是我开始没有把EnglishGreet和ChineseGreet以及GreetMaker三个方法声明为static,导致程序报错。我是这么认为的,既然是同一个类里的方法,就不需要实例化了(非statc方法血药实例化以后调用)。请问,我的想法错在哪里,然后为什么要把上面3个方法声明为static,谢谢!分值设高点,希望各位C#的大大们帮我解决下~~ 展开
using System.Collections.Generic;
using System.Text;
namespace delegent
{
class Program
{
public delegate void Greetdelegent(string name);
public static void EnglishGreet(string name)
{
Console.WriteLine("hellow," + name + "!");
}
public static void ChineseGreet(string name)
{
Console.WriteLine("heelow," + name + "!");
}
public static void GreetMaker(string name, Greetdelegent delegentmethod)
{
delegentmethod(name);
}
static void Main(string[] args)
{
GreetMaker("Lily", EnglishGreet);
GreetMaker("刘兵", ChineseGreet);
Console.ReadLine();
}
}
}
//////////////////////////////////////
以上是我写的一个关于委托的小程序,但是我开始没有把EnglishGreet和ChineseGreet以及GreetMaker三个方法声明为static,导致程序报错。我是这么认为的,既然是同一个类里的方法,就不需要实例化了(非statc方法血药实例化以后调用)。请问,我的想法错在哪里,然后为什么要把上面3个方法声明为static,谢谢!分值设高点,希望各位C#的大大们帮我解决下~~ 展开
5个回答
展开全部
首先你得明白:
静态方法与静态变量一样,属于类本身,而不属于那个类的一个对象。要想调用一个被定义为static的方法,必须在它前面加上这个类的名称。
实例方法必须通过类的实例来使用。实例方法可以使用类的非静态成员,也可以使用类的静态成员。
类的静态方法,静态变量是在类装载的时候装载的。但是要特别注意,类的静态变量是该类的对象所共有的,即是所有对象共享变量。所以建议尽量少用静态变量。尽量在静态方法中使用内部变量。
使用规则
静态方法只能访问类的静态成员,不能访问类的非静态成员;
非静态方法可以访问类的静态成员,也可以访问类的非静态成员;
静态方法不能使用实例来调用,只能使用类名来调用。
代码示例
using System;namespace TestStatic {
class StaticTest {
int x;
static int y;
public StaticTest(int a, int b) {
x = a;
y = b;
}
public void SimplePrint() {
Console.WriteLine("x=" + x + ",y=" + y);
}
public static void StaticPrint() {
Console.WriteLine("y={0}", y);
// Console.WriteLine("x={0}",x); //静态方法中不能使用非静态成员
}
}
class Test {
static void Main(string[]args) {
StaticTest st = new StaticTest(10, 23);
st.SimplePrint();
//st.StaticPrint(); //静态方法不能使用实例来调用
StaticTest.StaticPrint();
}
}
}
通过以上示例,你应该明白,为什么你在main方法中,一开始没有把EnglishGreet和ChineseGreet以及GreetMaker三个方法声明为static,导致程序报错。就是因为你在static方法中用了非static方法,如果要想非static的以上三种方法不报错,就必须实例化它们后再调用。
静态方法与静态变量一样,属于类本身,而不属于那个类的一个对象。要想调用一个被定义为static的方法,必须在它前面加上这个类的名称。
实例方法必须通过类的实例来使用。实例方法可以使用类的非静态成员,也可以使用类的静态成员。
类的静态方法,静态变量是在类装载的时候装载的。但是要特别注意,类的静态变量是该类的对象所共有的,即是所有对象共享变量。所以建议尽量少用静态变量。尽量在静态方法中使用内部变量。
使用规则
静态方法只能访问类的静态成员,不能访问类的非静态成员;
非静态方法可以访问类的静态成员,也可以访问类的非静态成员;
静态方法不能使用实例来调用,只能使用类名来调用。
代码示例
using System;namespace TestStatic {
class StaticTest {
int x;
static int y;
public StaticTest(int a, int b) {
x = a;
y = b;
}
public void SimplePrint() {
Console.WriteLine("x=" + x + ",y=" + y);
}
public static void StaticPrint() {
Console.WriteLine("y={0}", y);
// Console.WriteLine("x={0}",x); //静态方法中不能使用非静态成员
}
}
class Test {
static void Main(string[]args) {
StaticTest st = new StaticTest(10, 23);
st.SimplePrint();
//st.StaticPrint(); //静态方法不能使用实例来调用
StaticTest.StaticPrint();
}
}
}
通过以上示例,你应该明白,为什么你在main方法中,一开始没有把EnglishGreet和ChineseGreet以及GreetMaker三个方法声明为static,导致程序报错。就是因为你在static方法中用了非static方法,如果要想非static的以上三种方法不报错,就必须实例化它们后再调用。
追问
3Q,你真是太热心了。
展开全部
数据成员:
数据成员可以分静态变量、实例变量两种.
静态成员:静态成员变量是和类相关联的,可以作为类中"共"有的变量(是一个共性的表现),他不依赖特定对象的存在,访问的时候通过类名加点操作符加变量名来访问.
实例成员:实例成员变量是和对象相关联的,访问实例成员变量依赖于实例的存在.
函数成员:
方法可以主要分为静态方法,实例方法
静态方法:静态方法是不属于特定对象的方法,静态方法可以访问静态成员变量,静态方法不可以直接访问实例变量,可以在实例函数调用的情况下,实例变量做为参数传给静态方法。静态方法也不能直接调用实例方法,可以间接调用,首先要创建一个类的实例,然后通过这一特定对象来调用静态方法。
实例方法:一个实例方法的执行与特定对象关联,他的执行需要一个对象存在。实例方法可以直接访问静态变量和实例变量,实例方法可以直接访问实例方法、和静态方法,静态方法的访问方式为类名加点操作符加变量名。当多个实例对象存在时,内存中并不是存在美个特定的实例方法的拷贝,而是,相同类的所有对象都共享每个实例方法的一个拷贝(实例方法只占用“一套”空间)。
实例:
//类中的静态成员和非静态成员(C#版)
//下面我写一个例子来演示静态成员和非静态成员的区别
//类的成员要么是静态的,要么是动态的,如果将类的某个成员声明为static,则该成员是静态成员。
//类的静态成员是属于类所有,不必产生类的实例就可以访问它,就是只用类名就可以访问
//静态成员为类的所有实例所共享,无论这个类创建了多少个实例,一个静态成员在内存中只占有一块区域.
//类的非静态成员属于类的实例所有,每创建一个类的实例,都在内存中为非静态成员开辟了一块区域
//静态方法只能访问类例的静态字段,而非静态方法可以访问类例的所有字段
using System;
class Employee {
public static decimal Salary; // 静态字段
public string Name; // 非静态字段
public static void SetSalary(decimal B) //静态方法
{
Salary=B; // 正确,等价于Employee.Salary=B,注意这里不能访问Name变量的,因为它是静态方法
}
public void SetName(string N) //非静态方法
{
Name=N; // 正确,等价于this.Name=N.
}
}
class Sample
{
public static void Main()
{
Employee.Salary=500.0m; // 正确,静态字段可以按类名访问
Employee.SetSalary(500.0m); // 正确,静态方法可以按类名访问
Employee e=new Employee(); // 建立类Employee的一个实例
e.Name="蛙蛙王子"; // 正确,非静态字段必须通过实例访问
e.SetName("蛙蛙王子"); // 正确,非静态方法必须通过实例访问
// 注意,e.Name不能写成Employee.Name,即非静态成员不能按类名访问
// Employee.Salary也不能写成e.Salary,即静态成员不能通过类的实例访问
Console.WriteLine("员工姓名:{0}\n薪水:{1}元",
e.Name,Employee.Salary);
}
}
数据成员可以分静态变量、实例变量两种.
静态成员:静态成员变量是和类相关联的,可以作为类中"共"有的变量(是一个共性的表现),他不依赖特定对象的存在,访问的时候通过类名加点操作符加变量名来访问.
实例成员:实例成员变量是和对象相关联的,访问实例成员变量依赖于实例的存在.
函数成员:
方法可以主要分为静态方法,实例方法
静态方法:静态方法是不属于特定对象的方法,静态方法可以访问静态成员变量,静态方法不可以直接访问实例变量,可以在实例函数调用的情况下,实例变量做为参数传给静态方法。静态方法也不能直接调用实例方法,可以间接调用,首先要创建一个类的实例,然后通过这一特定对象来调用静态方法。
实例方法:一个实例方法的执行与特定对象关联,他的执行需要一个对象存在。实例方法可以直接访问静态变量和实例变量,实例方法可以直接访问实例方法、和静态方法,静态方法的访问方式为类名加点操作符加变量名。当多个实例对象存在时,内存中并不是存在美个特定的实例方法的拷贝,而是,相同类的所有对象都共享每个实例方法的一个拷贝(实例方法只占用“一套”空间)。
实例:
//类中的静态成员和非静态成员(C#版)
//下面我写一个例子来演示静态成员和非静态成员的区别
//类的成员要么是静态的,要么是动态的,如果将类的某个成员声明为static,则该成员是静态成员。
//类的静态成员是属于类所有,不必产生类的实例就可以访问它,就是只用类名就可以访问
//静态成员为类的所有实例所共享,无论这个类创建了多少个实例,一个静态成员在内存中只占有一块区域.
//类的非静态成员属于类的实例所有,每创建一个类的实例,都在内存中为非静态成员开辟了一块区域
//静态方法只能访问类例的静态字段,而非静态方法可以访问类例的所有字段
using System;
class Employee {
public static decimal Salary; // 静态字段
public string Name; // 非静态字段
public static void SetSalary(decimal B) //静态方法
{
Salary=B; // 正确,等价于Employee.Salary=B,注意这里不能访问Name变量的,因为它是静态方法
}
public void SetName(string N) //非静态方法
{
Name=N; // 正确,等价于this.Name=N.
}
}
class Sample
{
public static void Main()
{
Employee.Salary=500.0m; // 正确,静态字段可以按类名访问
Employee.SetSalary(500.0m); // 正确,静态方法可以按类名访问
Employee e=new Employee(); // 建立类Employee的一个实例
e.Name="蛙蛙王子"; // 正确,非静态字段必须通过实例访问
e.SetName("蛙蛙王子"); // 正确,非静态方法必须通过实例访问
// 注意,e.Name不能写成Employee.Name,即非静态成员不能按类名访问
// Employee.Salary也不能写成e.Salary,即静态成员不能通过类的实例访问
Console.WriteLine("员工姓名:{0}\n薪水:{1}元",
e.Name,Employee.Salary);
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
static的方法内,只能调用static的方法,或实例的方法
同一个类里的方法,也一样要遵循这个原则
同一个类里的方法,也一样要遵循这个原则
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
static void Main(string[] args)
静态方法里面只能调用静态方法.要么就要用invoke
静态方法里面只能调用静态方法.要么就要用invoke
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为你跟main入口点写在同一个class里了吧,main所在的这个class一定要求所有方法都是静态的
更多追问追答
追问
那我把main改成非static的后又如何?
追答
main不可以改成非static的,这个是程序的入口点,你如果把static去掉那谁去实例化这个程序?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询