在ASP.net中学习C#时,我无法理解几个课程。在哪种情况下,我应该使用以下类private,public,protected,abstract,static,sealed
?
如果有人能用简单的例子来解释这些,那就更好了。
答案 0 :(得分:19)
那些不是课程。
private
,protected
和public
是访问修饰符。它们表明哪些其他代码可以看到它们影响的代码:
public class Foo
{
private int _myOwn = 1;
protected int _mineAndChildren = 2;
public int _everyOnes = 3;
}
public class Bar : Foo
{
public void Method()
{
_myOwn = 2; // Illegal - can't access private member
_mineAndChildren = 3; // Works
_everyOnes = 4; // Works
}
}
public class Unrelated
{
public void Method()
{
Foo instance = new Foo();
instance._myOwn = 2; // Illegal - can't access private member
instance._mineAndChildren = 3; // Illegal
instance._everyOnes = 4; // Works
}
}
abstract
类可能包含abstract
个成员。 abstract
成员没有实现,因此所有派生类都必须实现abstract
成员。
无法继承sealed
类。 static
课程为sealed
,但也只能包含static
个成员。
我建议你从“Getting Started with Visual C#开始。这是一个非常基本的问题。
答案 1 :(得分:8)
public
,private
和protected
不是类,它们是访问修饰符。它们改变了允许访问用它们装饰的类的内容。它们适用于班级以及班级成员。
public
项目可以在任何地方看到private
类只能在同一个文件中看到private
类成员只能在该类中看到protected
成员可在班级及其后代中看到 internal
类在同一个程序集中是公共的。 abstract
关键字将某个类或方法标记为无实现,并且必须在派生类型中覆盖它(使用override
关键字)才能使用它
无法继承sealed
类。
在类成员上使用static
关键字表示该成员属于该类本身,而不是它的特定实例。将类标记为static
会强制限制此类的所有成员也必须为static
。
答案 2 :(得分:5)
private
,public
和protected
表示谁可以访问班级成员。私人意味着班上没有人能看到它。公众意味着每个人都可以看到它protected就像私有一样,但是子类可以访问它。
class Data
{
private int counter; // only accessible to class functions
protected int id; // accessible to class and subclass functions
public string name; // accessible from all code
}
abstract
表示这不是一个已完成的类 - 它可以用作子类的基础。通常在其定义中存在虚函数,函数旨在由子类“填充”。
abstract class Window
{
// cannot create objects of this class directly
// need to create sub class
}
类定义上的 static
意味着只有一个全局副本。它几乎将类恢复为旧式模块。对成员的static
表示它是类中的全局成员,对于您为该类创建的每个对象都没有不同的版本。
static class Configuration
{
// only one instance of the object
}
class Data
{
private static int counter; // all Data objects access this one counter
private int id; // each Data object has a different id
}
sealed
可以防止创建子类;它也可以应用于单个函数,以防止它们在子类中被覆盖。
sealed class TelephoneNumber
{
// cannot create subclass of TelephoneNumber
}
class Address
{
public sealed string FormatAddress()
{
// this function cannot be overridden on a subclass
}
}
答案 3 :(得分:3)
我不能评论你的问题,但我有一点点意见,但为你提供重要信息。
访问修饰符只是一个编译器功能。每个.net-programm都可以通过使用反射来忽略它,并且可以访问你的私有扩展类和方法。
一个例子:
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace ReflectPrivateMembers
{
class Program
{
static void Main(string[] args)
{
ConstructorInfo ci = typeof(Hello).GetConstructor(BindingFlags.NonPublic| BindingFlags.Instance ,null,System.Type.EmptyTypes,null);
object helloObject = ci.Invoke(System.Type.EmptyTypes);
MethodInfo[] helloObjectMethods = helloObject.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly| BindingFlags.Instance );
foreach (MethodInfo mi in helloObjectMethods)
{
mi.Invoke(helloObject, System.Type.EmptyTypes);
}
Console.ReadLine();
}
}
public class Hello
{
private Hello()
{
Console.WriteLine("Private Constructor");
}
public void HelloPub()
{
Console.WriteLine("Public Hello");
}
private void HelloPriv()
{
Console.WriteLine("Private Hello");
}
}
}
答案 4 :(得分:2)
前三个是访问修饰符,它们可以应用于类型和成员。 私有表示只能在其声明类型中访问某些内容。 protected 表示某些内容可以由声明类型的继承者访问,也可以由类型本身中的某些内容访问。 公开表示可以从对声明类型有效引用的任何地方访问某些内容。
其余的也可以应用于类型和成员。 抽象 (在成员上)表示该成员没有实现(该实现必须由该类型的继承者提供)或(在类型上)该类型无法实例化(仅继承)。 静态 (在成员上)表示成员由所有呼叫者静态共享,或者(在类型上)该类型只能包含静态成员因此无法实例化(即它没有任何实例成员,因此无法为其自身的任何实例提供服务)。 密封 (在继承的虚拟或抽象成员上)意味着该类型的继承者不能覆盖该成员,或者(在类型上)类型不能继承。
您应该注意以下几种其他修饰符: 内部是另一个访问修饰符,这意味着某些内容可以被同一个程序集(或项目)中的任何内容访问,而不是声明类型。
另外, 虚拟 (在成员上)表示该成员可以选择由类型的继承者覆盖,但提供其自己的默认实现。 部分 (在成员上)允许您在一个文件中提供成员的签名,在另一个文件中提供实现,或(在某个类型上)允许您跨多个代码文件拆分类型的定义。
答案 5 :(得分:1)
你所拥有的是修饰语,而不是类的类型。
private
,public
和protected
是访问修饰符。它们定义了您希望代码的可访问性。
在查看您列出的其他修饰符之前,我建议您尝试掌握面向对象编程。 Here是一个充满了您可以查看的优质资源的链接。
答案 6 :(得分:1)
private,public,protected是c#语言支持的访问修饰符:这里是msdn链接以获取更多详细信息Access Modifiers
答案 7 :(得分:0)
private
和public
指的是它所在的程序集(例如DLL或EXE)之外的类的可见性。protected
是方法的修饰符,它只表示类继承自声明者可以调用该方法。
abstract
标识无法直接创建的类,并且仅用于为其他类提供基础。
应用于方法,static
表示可以将它们作为类型的一部分进行访问,而不是类的实例:
class Bar {
static void Foo() { ... }
void Foo() { ... }
}
第一个可以像这样调用:
Bar.Foo();
第二个只有这样:
Bar b = new Bar();
b.Foo();
应用于类,static
限制类仅包含静态方法。它比其他任何东西都更美观,但它也有助于编译器。
sealed
修饰符告诉编译器无法继承类。