public修饰符
using System;
using System.Collections.Generic;
using System.Text;
namespace CSharplearn
{
class 被输出对象
{
public string a;
}
class Program
{
static void Main(string[] args)
{
被输出对象 b = new 被输出对象();
b.a = "Hello World";
Console.WriteLine(b.a);
}
}
}
上面程序写了一个"被输出对象"类,里面有一个字段a.Main()首先实例化了被输出对象这个类,然后向字段a里赋值"Hello World",最后打印该字段.
其中可以字段a前面跟了一个public,这到底是什么意思.
首先我们试试把public删除.然后可以发现
底下的程序报错了,说是有什么什么保护级别.所以只有加了public我才可以跳出类去使用这个字段.
于是你就容易理解什么是访问修饰符.
- public:公开的,可以在外部任何地方使用
- internal:内部的,可以在当前项目中使用
- private(默认):私有的,只能在自己类的内部使用
static修饰符
如果给"被输出的对象"类和字段a加上static修饰符程序就可以省去实例化对象,来看看变化.
using System;
using System.Collections.Generic;
using System.Text;
namespace CSharplearn
{
static class 被输出对象
{
public static string a;
}
class Program
{
static void Main(string[] args)
{
被输出对象.a = "Hello World";
Console.WriteLine(被输出对象.a);
}
}
}
省去了"被输出对象 b = new 被输出对象();",感觉很方便?是不是所有类都可以加上static修饰符以便于后面调用该类的时候直接 . 一下就可以调用方法和属性?
我们再看一段代码
using System;
using System.Collections.Generic;
using System.Text;
namespace CSharplearn
{
static class 被输出对象
{
public static string a = "Hello World";
}
class 打印方法
{
public void print()
{
Console.WriteLine(被输出对象.a);
}
}
class Program
{
static void Main(string[] args)
{
打印方法 method = new 打印方法();
method.print();
Console.WriteLine(被输出对象.a);
被输出对象.a = "Hello Earth";
method.print();
Console.WriteLine(被输出对象.a);
}
}
}
结果:
前面两句method.print()和Console.WriteLine(被输出对象.a)不难理解,他们理应输出"被输出对象.a",也就是初始化时给的"Hello World".但注意后面,当我给"被输出的对象.a"赋了新的字符串,两个输出语句输出的内容也跟着发生了变化.
于是可以得知,被 static 修饰的变量,被 static 修饰的方法统一属于类的静态资源,是类实例之间共享的.换言之,一处变,处处变.
创建实例
这篇知乎文章讲的很明白:
https://zhuanlan.zhihu.com/p/92207957
用我的话来讲,每个类就像是机械加工的模具,在你new它的时候,就相当于给模具倒上铁水,声明一个类变量就是做机器的外壳,当内容与外壳拼在一起的时候,你就可以使用它了.(当然实际不是这么回事)