c#非静态的字段 方法或属性 要求对象引用的问题
要使用类中定义的非静态字段、属性和方法,必须先实例化类,然后通过实例使用非静态的字段、属性和方法。例如
using System;
namespace ConsoleApplication1
{
class TestClass
{
/// <summary>
/// 非静态字段
/// </summary>
public int X;
/// <summary>
/// 非静态属性
/// </summary>
public string Name { get; set; }
/// <summary>
/// 非静态方法
/// </summary>
public void PrintInfo()
{
Console.WriteLine("X = {0}", X);
Console.WriteLine("Name = {0}", Name);
}
}
// 测试:使用TestClass定义的非静态成员
class Program
{
static void Main(string[] args)
{
// 1. 实例化TestClass
TestClass tc = new TestClass();
// 2. 使用非静态字段
tc.X = 100;
// 3. 使用非静态属性
tc.Name = "Lisa";
// 4. 使用非静态方法
tc.PrintInfo();
}
}
}
核心点:一个类的非静态成员(字段、属性和方法)必须(也只能)通过实例来使用或调用!
其实就是要使用的字段,方法或属性是非静态方法,要在实例化对象中使用它们:
代码如下:
public class Team
{
public static int personcount;
protected static string teamname;
private static int foundyearnumber;
internal string leadername=string.Empty;
static void F()
{
//在外部类型访问嵌套类型成员的格式:嵌套类型.成员
Nested.innernum = 1;//外部类型可以直接访问嵌套类型的静态公共成员,public,internal
Nested.ppx = 3;//外部类型不可以直接访问嵌套类型的非静态公共成员
Nested n1 = new Nested();
Team t1 = new Team();
t1.leadername = n1.nonstax;
}
//嵌套或内部类型
//在类或结构内部定义
//嵌套类型默认为private,即嵌套类型对于外部类型(指team之外的类型),team是它的包含类型
//但嵌套类型可以设置为public,protected,internal,protected internal,private
//嵌套类型可访问包含类型,如想访问包含类型,请将其作为构造函数传递给嵌套类型
public class Nested
{
//private Nested parent;//在嵌套类型中定义一个包含类型的变量或字段
public Nested()//在嵌套类型中访问包含类型,为嵌套类型的构造函数传递包含类型的参数 {
//this.parent=p;
//personcount = 1;//嵌套类型不能访问包含类型(外部类型)的非静态成员
//说明在内部类型中可以直接访问外部类型的public,private,protected,internal各类修饰符的static静态成员,而不是非静态成员
//在内部类型中可以直接访问外部类型成员是直接引用
personcount = 2;
teamname = "ls";
foundyearnumber = 3;
}
public static int innernum;
internal static int ppx;
protected static int ps;
private static int pria;
public string nonstax;
}
}
扩展资料
C#中静态与非静态方法比较:
最直观的差别:使用了static 修饰符的方法为静态方法,反之则是非静态方法。
C#静态成员:
①静态成员属于类所有,非静态成员属于类的实例所有。
②每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;
静态成员属于类所有,为各个类的实例所公用,无论类创建了多少实例,类的静态成员在内存中只占同一块区域。
C#静态方法:
1、C#静态方法属于类所有,类实例化前即可使用。
2、非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员。
3、因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存,这样,C#静态方法调用时无法判断非静态变量使用的内存地址。所以无法使用。而静态变量的地址对类来说是固定的,故可以使用。