C#中的void和private void有什么区别?

4
在C# UI代码中,当我创建事件方法时,它会自动填充以下内容:
void simpleButton_click(object sender, Eventargs e)
{
}

这个简单的 voidprivate void 有什么区别呢?

https://dev59.com/cnE85IYBdhLWcg3w9orw - The Internet
2个回答

14

这是语法问题。默认情况下,成员private 的,而类型是 internal 的。

通常人们为了保持一致性会添加 private,特别是在一个类或类型中有许多其他访问属性不同的成员(例如 protected internalpublic)时。

因此,以下两个文件是等效的:

Implicit.cs

using System;

namespace Foo
{
    class Car : IVehicle
    {
        Car(String make)
        {
            this.Make = make;
        }

        String Make { get; set; }

        CarEngine Engine { get; set; }

        void TurnIgnition()
        {
            this.Engine.EngageStarterMotor();
        }

        class CarEngine
        {
            Int32 Cylinders { get; set; }

            void EngageStarterMotor()
            {
            }
        }

        delegate void SomeOtherAction(Int32 x);

        // The operator overloads won't compile as they must be public.
        static Boolean operator==(Car left, Car right) { return false; }
        static Boolean operator!=(Car left, Car right) { return true; }
    }

    struct Bicycle : IVehicle
    {
        String Model { get; set; }
    }

    interface IVehicle
    {
        void Move();
    }

    delegate void SomeAction(Int32 x);
}

Explicit.cs

using System;

namespace Foo
{
    internal class Car : IVehicle
    {
        private Car(String make)
        {
            this.Make = make;
        }

        private String Make { get; set; }

        private CarEngine Engine { get; set; }

        private void TurnIgnition()
        {
            this.Engine.EngageStarterMotor();
        }

        private class CarEngine
        {
            private Int32 Cylinders { get; set; }

            private void EngageStarterMotor()
            {
            }
        }

        private delegate void SomeOtherAction(Int32 x);

        public static Boolean operator==(Car left, Car right) { return false; }
        public static Boolean operator!=(Car left, Car right) { return true; }
    }

    internal struct Bicycle : IVehicle
    {
        private String Model { get; set; }
    }

    internal interface IVehicle
    {
        public void Move(); // this is a compile error as interface members cannot have access modifiers
    }

    internal delegate void SomeAction(Int32 x);
}

规则概述:

  • namespace 中直接定义的类型(classstructenumdelegateinterface)默认为 internal
  • 成员(方法、构造函数、属性、嵌套类型、事件)默认为 private,但有两个例外:
    • 操作符重载必须显式标记为 public static。如果未提供显式的 public 访问修饰符,则会出现编译错误。
    • 接口成员始终为 public,您无法提供显式访问修饰符。
  • 在 C# 中,classstruct 成员默认为 private,而不像 C++ 中 struct 默认为 publicclass 默认为 private
  • C# 中没有隐式的 protectedprotected internal
  • .NET 支持“友元程序集”,其中 internal 类型和成员对另一个程序集内部的代码可见。C# 需要使用 [assembly: InternalsVisibleTo] 属性来实现此功能。这与 C++ 的 friend 功能不同(C++ 的 friend 允许一个 class/struct 列出其他类、结构和自由函数,这些类、结构和自由函数将可以访问其 private 成员)。

1
这是有关此主题的MSDN页面链接:http://msdn.microsoft.com/en-us/library/ms173121.aspx。如果您没有放置访问修饰符,则默认值将列在其中(对于类而言,它可能是`private`或`internal`,具体取决于类的声明位置)。 - Scott Chamberlain
4
需要注意的是,这并不适用于所有情况。类的默认访问修饰符为 internal。 - The Internet

-4

void 表示将此代码块或过程标识为 方法,或者它不会返回任何值。如果您看到除 void 之外的任何类型,则表示该代码块或过程是一个函数或属性。

这是一个方法。

private void DoSomething()
{
...code
}

这是一个函数

private int DoSomething()
{
..code
return 1
}

private 表示该方法、函数或属性不可被外部类访问,但可以在类内部调用。

public 表示该方法、函数或属性可被外部类访问,并且也可以在类内部调用。


1
这并没有回答问题。 - Harrison
@Harrison,他的问题是这个简单的void和private void有什么区别?从访问修饰符(Private)中阅读此内容http://msdn.microsoft.com/en-us/library/st6sy9xe.aspx,关于void请参见http://msdn.microsoft.com/en-us/library/yah0tteb.aspx。 - Jade
问题是关于是否明确使用private关键字(在这种情况下,对于方法仍然是private)。您的答案涉及基于private vs. public和返回值的可访问性。 - Harrison
好的,我不会与你争论这个问题,但对于我来说,如果你理解它的作用,那么差异也将被知晓。 - Jade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接