最近因工作需要,接手公司的项目,主要语言为c#,在写代码的时候,需要调用原先的一些方法,发现有的方法有现成的已经实现了,但是自己想调用的时候发现却无法使用,仔细观察调用的方法之间的区别,我想调用的方法是一个普通方法,而我使用的方法是一个由static关键字修饰的方法,在调用的过程中会提示我无法调用。上网查阅了一下相关资料,同时自己也开了一个小的demo来测试各种调用方法的差别。
因为是初学c#,所以此处书博客一篇,以作纪念。
一眼观之,static第一重限制即可见,实例化的方法无法直接调用static修饰的方法。
修改了些代码,如下
namespace test2019_1_28
{
class Program
{
static void Main(string[] args)
{
Program testPP = new Program();
testPP.TestPrivate();
testPP.TestPublic();
// testPP.StaPubTest();
// testPP.StaPriTest();
StaPubTest();
StaPriTest();
System.Console.ReadKey();
}
private void TestPublic()
{
System.Console.WriteLine("testPublic");
}
public void TestPrivate()
{
System.Console.WriteLine("testPrivate");
}
public static void StaPubTest()
{
System.Console.WriteLine("testStaticPrivate");
}
private static void StaPriTest()
{
System.Console.WriteLine("testStaticPrivate");
}
}
}
结果如下,可知在当前类内,private static和public static都是可以直接访问到的,而private和public方法都是可以通过实例化调用的。
那我再加点料,新创建一个类,在类外访问这两个方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace test2019_1_28
{
class Program
{
static void Main(string[] args)
{
Program testPP = new Program();
testPP.TestPrivate();
testPP.TestPublic();
// testPP.StaPubTest();
// testPP.StaPriTest();
StaPubTest();
StaPriTest();
//StaPubTest1();
//StaPriTest1();
testStatic.StaPubTest1();
// testStatic.StaPriTest1();
System.Console.ReadKey();
}
private void TestPublic()
{
System.Console.WriteLine("testPublic");
// TestPrivate();
// StaPubTest();
// StaPriTest();
}
public void TestPrivate()
{
System.Console.WriteLine("testPrivate");
// TestPublic();
// StaPubTest();
// StaPriTest();
}
public static void StaPubTest()
{
System.Console.WriteLine("testStaticPublic");
// TestPublic();
//TestPrivate();
// StaPriTest();
}
private static void StaPriTest()
{
System.Console.WriteLine("testStaticPrivate");
//TestPublic();
//TestPrivate();
//StaPubTest();
}
}
class testStatic
{
private static void StaPriTest1()
{
System.Console.WriteLine("Class.testStaticPrivate");
}
public static void StaPubTest1()
{
System.Console.WriteLine("Class.testStaticPublic");
}
private void TestPublic1()
{
System.Console.WriteLine("testPublic");
}
public void TestPrivate1()
{
System.Console.WriteLine("testPrivate");
}
}
}
首先,类外访问private修饰的static方法、不加类名直接调用都会直接报错,如下图,注释掉后点击运行,结果如下,可知类外只可以直接(不用实例化)用类名访问public static,其他都不行。
再测试不同方法之间的互相调用,如下图:
首先,如图所示(不得不说,编译器好用确实比较省事),普通方法不可以被static方法调用。
然后注掉代码测试运行,修改后代码如下:
namespace test2019_1_28
{
class Program
{
static void Main(string[] args)
{
Program testPP = new Program();
// testPP.TestPrivate();
testPP.TestPublic();
// StaPubTest();
//StaPriTest();
// StaPubTest1();
// StaPriTest1();
System.Console.ReadKey();
}
private void TestPublic()
{
System.Console.WriteLine("testPublic");
TestPrivate();
StaPubTest();
StaPriTest();
}
public void TestPrivate()
{
System.Console.WriteLine("testPrivate");
// TestPublic();
// StaPubTest();
// StaPriTest();
}
public static void StaPubTest()
{
System.Console.WriteLine("testStaticPublic");
//TestPublic();
// TestPrivate();
// StaPriTest();
}
private static void StaPriTest()
{
System.Console.WriteLine("testStaticPrivate");
//TestPublic();
//TestPrivate();
// StaPubTest();
}
}
}
依次测试不同的调用方法,如下:
第一行结果表示调用的方法类型,依次为piublic、private、static public、static private类型的方法。
结果也显而易见,
public和private方法可以直接调用所有的方法,
而static方法之间只能互相调用,不能调用普通的未加static关键字修饰的方法。
综上可得如下表格(上面只为部分测试,在测试完所有组合后,我得到的如下表格)
类外访问 | 类内访问(调用) | |||||
---|---|---|---|---|---|---|
类名调用 | 实例化调用 | public调用 | private调用 | public static调用 | private static调用 | |
public | 否 | 可以 | 可以 | 可以 | 否 | 否 |
private | 否 | 否 | 可以 | 可以 | 否 | 否 |
public static | 是 | 否 | 可以 | 可以 | 可以 | 可以 |
private static | 否 | 否 | 可以 | 可以 | 可以 | 可以 |
写到这里,我在想,那我如果要在类外调用一个调用了static private的static public函数,还有调用了private的public方法以及调用了private static的public会怎么样,说干就干,修改了下另一个类的方法,测试结果。
class testStatic
{
private static void StaPriTest1()
{
System.Console.WriteLine("Class.testStaticPrivate");
}
public static void StaPubTest1()
{
System.Console.WriteLine("Class.testStaticPublic");
StaPriTest1();
}
public void TestPublic1()
{
System.Console.WriteLine("Class.testPublic");
TestPrivate1();
StaPriTest1();
}
private void TestPrivate1()
{
System.Console.WriteLine("Class.testPrivate");
//TestPublic1();
}
}
由上图测试结果可知,一个调用了private方法的public类型的函数,在类外依旧是可以访问到的,不会如同普通的private函数一般具有访问权限。换言之,以后的c#编程,如果我需要把一个类内的私有方法开放到类外,只需用一个public方法将其包装一下即可,当然,一般情况不建议这么干,毕竟这样会破坏代码的封装性。