c#访问修饰符

时间:2021-12-15 02:58:30
今天想整理一下访问修饰符,当然对老鸟来说不用介绍了,但是我相信对新人来说一定有必要说一下,
所以在网上查了一下,没有一个完整的介绍,除了概念就是概念,老鸟看了那些文字都要头疼,
所以决定今天整理出来用例子说明来为大家解释一下吧:
首先介绍一下类的修饰符
作为一个*类(即不是内部类)只能使用public和internal两种访问修饰符,它们的意义如下。
— public:所修饰的*类的可访问域是它所在的程序和任何引用该程序的程序,因此访问不受限制。
— internal:所修饰的*类的可访问域是定义它的程序。
public不必介绍哪都可以new一下,但是internal必须在自己的项目内使用,
这里有必要向大家介绍项目和程序集,简单点项目包括:控制台应用程序,Windows应用程序,类库(Class Library)等,而程序集叫Assembly(也就是我们创建项目中的AssemblyInfo.cs文件),
一个项目也就是一个程序集,Assembly用处很大,但与我们的专题无关,不做介绍。
介绍上面的目的为了说明,一个项目的internal无法在另一个项目中调用,代码:

class1:
c#访问修饰符using System;
c#访问修饰符
using System.Collections.Generic;
c#访问修饰符
using System.Text;
c#访问修饰符
c#访问修饰符
namespace xiaolei
c#访问修饰符c#访问修饰符
{
c#访问修饰符    
//public class Class1
c#访问修饰符    
//{
c#访问修饰符        
//public int aa;
c#访问修饰符    
//}
c#访问修饰符

c#访问修饰符    
internal class Class1
c#访问修饰符c#访问修饰符    
{
c#访问修饰符        
public int aa;
c#访问修饰符    }

c#访问修饰符
c#访问修饰符    
class Class11
c#访问修饰符c#访问修饰符    
{
c#访问修饰符        
public void bb()
c#访问修饰符c#访问修饰符        
{
c#访问修饰符            Class1 cc 
= new Class1();
c#访问修饰符        }

c#访问修饰符    
c#访问修饰符    }

c#访问修饰符}

c#访问修饰符

class2:
c#访问修饰符using System;
c#访问修饰符
using System.Collections.Generic;
c#访问修饰符
using System.Text;
c#访问修饰符
c#访问修饰符
c#访问修饰符
namespace fanxing
c#访问修饰符c#访问修饰符
{
c#访问修饰符    
class Application1
c#访问修饰符c#访问修饰符    
{
c#访问修饰符      
static void Main(string[] args)
c#访问修饰符c#访问修饰符        
{
c#访问修饰符            xiaolei.Class1 aaa 
= new xiaolei.Class1();
c#访问修饰符            System.Console.Read();
c#访问修饰符        }

c#访问修饰符   }

c#访问修饰符
c#访问修饰符 }
上面我建立了两个项目,一个是类库,一个是控制台,
上面我在控制台class2引入了类库class1,这些操作简略,大家可以看到我上面的class1用了public,
所以在class2成功的得到,大家把把class1修改为internal class1,就可以看到效果了,在class2中无法引出,
但是在class11中可以得到。

很简单,接下来我们介绍方法或者属性的修饰符:
概念性的东西拿来用下:

访问修饰符

   

public

访问不受限制,可以类内和任何类外的代码中访问

protected

可访问域限定于类内或从该类派生的类内

internal

可访问域限定于类所在的程序内

protected internal

protected或者internal,即可访问域限定于类所在的程序或那些由它所属的类派生的类内

private

可访问域限定于它所属的类内


现在做解释首先,public不做介绍,
接下来是protected,
protected就只能被子类内部所访问(不管这个子类在哪个项目里)
如果在同一程序集里面,不是子类的话,仅仅实例化该类,其中的protected所修饰的成员就不能被访问
c#访问修饰符using System;
c#访问修饰符
using System.Collections.Generic;
c#访问修饰符
using System.Text;
c#访问修饰符
c#访问修饰符
c#访问修饰符
namespace aaa
c#访问修饰符c#访问修饰符
{
c#访问修饰符    
public  class Class2
c#访问修饰符c#访问修饰符    
{
c#访问修饰符        
protected int bb;
c#访问修饰符        
public int cc;
c#访问修饰符    }

c#访问修饰符
c#访问修饰符    
public class class22
c#访问修饰符c#访问修饰符    

c#访问修饰符        
protected void  bbb()
c#访问修饰符c#访问修饰符        
{
c#访问修饰符            Class2 bbbb
=new Class2();
c#访问修饰符            
//只能得到bbbb.cc
c#访问修饰符
        }

c#访问修饰符    }

c#访问修饰符
c#访问修饰符    
public class class33:Class2
c#访问修饰符c#访问修饰符    
{
c#访问修饰符        
public void bbb()
c#访问修饰符c#访问修饰符        
{
c#访问修饰符            
//可得到base.bb,base.cc
c#访问修饰符
        }

c#访问修饰符    }

c#访问修饰符}

c#访问修饰符
c#访问修饰符
这是在一个项目中,如果再加一个项目
c#访问修饰符using System;
c#访问修饰符
using System.Collections.Generic;
c#访问修饰符
using System.Text;
c#访问修饰符
c#访问修饰符
c#访问修饰符
namespace fanxing
c#访问修饰符c#访问修饰符
{
c#访问修饰符    
class Application1:aaa.Class2
c#访问修饰符c#访问修饰符    
{
c#访问修饰符      
public void  aaa()
c#访问修饰符c#访问修饰符        
{
c#访问修饰符            
//base.bb; base.cc;
c#访问修饰符
        }

c#访问修饰符
c#访问修饰符      
static void Main(string[] args)
c#访问修饰符c#访问修饰符        
{
c#访问修饰符           aaa.Class2 bbb 
= new aaa.Class2();
c#访问修饰符          
//bbb.cc;
c#访问修饰符
            System.Console.Read();
c#访问修饰符        }

c#访问修饰符   }

c#访问修饰符
c#访问修饰符 }
一样的道理!

private也很简单,只能在定义的类内部使用,别处不管是派生类等都不能使用。

internal和我们解释的类的修饰符一样,只能在一个项目中使用(不管是实例化还是派生均可见),在别的项目中看不到
c#访问修饰符using System;
c#访问修饰符
using System.Collections.Generic;
c#访问修饰符
using System.Text;
c#访问修饰符
c#访问修饰符
c#访问修饰符
namespace aaa
c#访问修饰符c#访问修饰符
{
c#访问修饰符    
public  class Class2
c#访问修饰符c#访问修饰符    
{
c#访问修饰符        
internal int bb;
c#访问修饰符        
public int cc;
c#访问修饰符    }

c#访问修饰符
c#访问修饰符    
public class class22
c#访问修饰符c#访问修饰符    

c#访问修饰符        
internal void  bbb()
c#访问修饰符c#访问修饰符        
{
c#访问修饰符            Class2 bbbb
=new Class2();
c#访问修饰符            
//bbbb.bb;bbbb.cc;
c#访问修饰符
        }

c#访问修饰符    }

c#访问修饰符
c#访问修饰符    
public class class33:Class2
c#访问修饰符c#访问修饰符    
{
c#访问修饰符        
public void bbb()
c#访问修饰符c#访问修饰符        
{
c#访问修饰符            
//base.bb;base.cc;
c#访问修饰符
        }

c#访问修饰符    }

c#访问修饰符}

c#访问修饰符
c#访问修饰符
在一个项目中,大家可以看都均可见,
c#访问修饰符using System;
c#访问修饰符
using System.Collections.Generic;
c#访问修饰符
using System.Text;
c#访问修饰符
c#访问修饰符
c#访问修饰符
namespace fanxing
c#访问修饰符c#访问修饰符
{
c#访问修饰符    
class Application1:aaa.Class2
c#访问修饰符c#访问修饰符    
{
c#访问修饰符      
public void  aaa()
c#访问修饰符c#访问修饰符        
{
c#访问修饰符            
//base.cc;
c#访问修饰符
        }

c#访问修饰符   }

c#访问修饰符
c#访问修饰符    
class bbb
c#访问修饰符c#访问修饰符    
{
c#访问修饰符          
public void  ccc()
c#访问修饰符c#访问修饰符        
{
c#访问修饰符            aaa.Class2 ddd 
= new aaa.Class2();
c#访问修饰符             
//ddd.cc;
c#访问修饰符
        }

c#访问修饰符    
c#访问修饰符    }

c#访问修饰符
c#访问修饰符 }
在另一个项目中我们可以看到只能看到public的属性,internal不见了。

最后我们讲protected internal,看了大家也应该明白
protected internal是protected和interval的集合体,
确切的说应该是一个并集,
意义就是它能被类的子类所访问并且(不管这个子类在哪个程序集里)即protected的实现部分
并且能被同一个程序集的类所访问即internal的实现部分

c#访问修饰符using System;
c#访问修饰符
using System.Collections.Generic;
c#访问修饰符
using System.Text;
c#访问修饰符
c#访问修饰符
c#访问修饰符
namespace aaa
c#访问修饰符c#访问修饰符
{
c#访问修饰符    
public  class Class2
c#访问修饰符c#访问修饰符    
{
c#访问修饰符       
internal  protected int  aa;
c#访问修饰符        
internal int bb;
c#访问修饰符        
protected int cc;
c#访问修饰符    }

c#访问修饰符
c#访问修饰符    
public class class22
c#访问修饰符c#访问修饰符    

c#访问修饰符        
public void  bbb()
c#访问修饰符c#访问修饰符        
{
c#访问修饰符            Class2 bbbb
=new Class2();
c#访问修饰符            
//bbbb.aa;bbbb.bb
c#访问修饰符
        }

c#访问修饰符    }

c#访问修饰符
c#访问修饰符    
public class class33:Class2
c#访问修饰符c#访问修饰符    
{
c#访问修饰符        
public void bbb()
c#访问修饰符c#访问修饰符        
{
c#访问修饰符            
//base.aa; base.bb; base.cc;
c#访问修饰符
        }

c#访问修饰符    }

c#访问修饰符}

c#访问修饰符
c#访问修饰符
在一个项目中我们的可见
c#访问修饰符using System;
c#访问修饰符
using System.Collections.Generic;
c#访问修饰符
using System.Text;
c#访问修饰符
c#访问修饰符
c#访问修饰符
namespace fanxing
c#访问修饰符c#访问修饰符
{
c#访问修饰符    
class Application1:aaa.Class2
c#访问修饰符c#访问修饰符    
{
c#访问修饰符      
public void  aaa()
c#访问修饰符c#访问修饰符        
{
c#访问修饰符            
//base.aa;base.cc
c#访问修饰符
        }

c#访问修饰符   }

c#访问修饰符
c#访问修饰符    
class bbb
c#访问修饰符c#访问修饰符    
{
c#访问修饰符          
public void  ccc()
c#访问修饰符c#访问修饰符        
{
c#访问修饰符            aaa.Class2 ddd 
= new aaa.Class2();
c#访问修饰符            
//ddd.
c#访问修饰符
        }

c#访问修饰符    
c#访问修饰符    }

c#访问修饰符
c#访问修饰符 }

在另一个项目中引用我们看到的效果,我想这样一对比大家已经有了很清楚的认识了吧。
好了到此为止。