在C#中使用“类”

时间:2010-06-22 06:44:16

标签: c#

在ASP.net中学习C#时,我无法理解几个课程。在哪种情况下,我应该使用以下类private,public,protected,abstract,static,sealed

如果有人能用简单的例子来解释这些,那就更好了。

8 个答案:

答案 0 :(得分:19)

那些不是课程。

privateprotectedpublic是访问修饰符。它们表明哪些其他代码可以看到它们影响的代码:

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)

publicprivateprotected不是类,它们是访问修饰符。它们改变了允许访问用它们装饰的类的内容。它们适用于班级以及班级成员。

  • public项目可以在任何地方看到
  • private类只能在同一个文件中看到
  • private类成员只能在该类中看到
  • protected成员可在班级及其后代中看到
  • internal类在同一个程序集中是公共的。

abstract关键字将某个类或方法标记为无实现,并且必须在派生类型中覆盖它(使用override关键字)才能使用它

无法继承sealed类。

在类成员上使用static关键字表示该成员属于该类本身,而不是它的特定实例。将类标记为static会强制限制此类的所有成员也必须为static

答案 2 :(得分:5)

privatepublicprotected表示谁可以访问班级成员。私人意味着班上没有人能看到它。公众意味着每个人都可以看到它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");
        }
    }
}

来源:Reflection with Private Members

答案 4 :(得分:2)

前三个是访问修饰符,它们可以应用于类型和成员。 私有表示只能在其声明类型中访问某些内容。 protected 表示某些内容可以由声明类型的继承者访问,也可以由类型本身中的某些内容访问。 公开表示可以从对声明类型有效引用的任何地方访问某些内容。

其余的也可以应用于类型和成员。 抽象 (在成员上)表示该成员没有实现(该实现必须由该类型的继承者提供)或(在类型上)该类型无法实例化(仅继承)。 静态 (在成员上)表示成员由所有呼叫者静态共享,或者(在类型上)该类型只能包含静态成员因此无法实例化(即它没有任何实例成员,因此无法为其自身的任何实例提供服务)。 密封 (在继承的虚拟或抽象成员上)意味着该类型的继承者不能覆盖该成员,或者(在类型上)类型不能继承。

您应该注意以下几种其他修饰符: 内部是另一个访问修饰符,这意味着某些内容可以被同一个程序集(或项目)中的任何内容访问,而不是声明类型。

另外, 虚拟 (在成员上)表示该成员可以选择由类型的继承者覆盖,但提供其自己的默认实现。 部分 (在成员上)允许您在一个文件中提供成员的签名,在另一个文件中提供实现,或(在某个类型上)允许您跨多个代码文件拆分类型的定义。

答案 5 :(得分:1)

你所拥有的是修饰语,而不是类的类型。

privatepublicprotected访问修饰符。它们定义了您希望代码的可访问性。

在查看您列出的其他修饰符之前,我建议您尝试掌握面向对象编程。 Here是一个充满了您可以查看的优质资源的链接。

答案 6 :(得分:1)

private,public,protected是c#语言支持的访问修饰符:这里是msdn链接以获取更多详细信息Access Modifiers

Abstract and Sealed Classes and Class Members

Static Classes and Static Class Members

答案 7 :(得分:0)

privatepublic指的是它所在的程序集(例如DLL或EXE)之外的类的可见性。protected是方法的修饰符,它只表示类继承自声明者可以调用该方法。

abstract标识无法直接创建的类,并且仅用于为其他类提供基础。

应用于方法,static表示可以将它们作为类型的一部分进行访问,而不是类的实例:

class Bar {
    static void Foo() { ... }
    void Foo() { ... }
}

第一个可以像这样调用:

Bar.Foo();

第二个只有这样:

Bar b = new Bar();
b.Foo();

应用于类,static限制类仅包含静态方法。它比其他任何东西都更美观,但它也有助于编译器。

sealed修饰符告诉编译器无法继承类。