C#文件编写公约

时间:2013-05-29 18:19:15

标签: c# coding-style

如果我没有弄错,用C ++编写类的传统方法如下(这只是一个说明性的例子):

MyClass.h

// MyClass.h

#ifndef MY_CLASS_H
#define MY_CLASS_H

class MyClass
{
public:
    MyClass();
    MyClass(int);
    void method1(int);
    int method2();

private:
    int field;
};

#endif

MyClass.cpp

// MyClass.cpp 

#include "MyClass.h"

MyClass::MyClass()
{
    field = 0;
}

MyClass::MyClass(int n)
{
    field = n;
}

void MyClass::method1(int n)
{
    field = n;
}

int MyClass::method2()
{
    return field;
}

的main.cpp

// main.cpp

#include <iostream>

#include "MyClass.h"

using namespace std;

int main()
{
    MyClass mc;

    mc.method1(2);
    cout << mc.method2();

    return 0;
}

这个项目的传统C#等价物是什么?此外,如果我在上面的示例中错误地描绘了传统上正确的C ++,请修复它以帮助防止混淆未来的读者。

4 个答案:

答案 0 :(得分:5)

在C#中,所有声明都是内联的,每个成员声明中都包含“private”和“public”等访问说明符;在C#中,publicprivateprotectedinternal是成员的修饰符,就像static使用任何一种语言一样:

    public class MyClass
    {
        //  ...

        /// <summary>
        /// The "///<summary>" convention is recognized by the IDE, which
        /// uses the text to generate context help for the member. 
        /// 
        /// As TyCobb notes below, method1 in correct C# idiom is more 
        /// likely to be a property than a method -- and the field "backing"
        /// it would be given the same name, but with the first letter 
        /// lowercased and prefixed with an underscore. 
        /// </summary>
        public int Property1
        {
            get { return _property1; }
            set { _property1 = value; }
        }
        private int _property1 = 0;

        private bool _flag1 = false;

        // Regions are a convenience. They don't affect compilation. 
        #region Public Methods
        /// <summary>
        /// Do something arbitrary
        /// </summary>
        public void Method2()
        {
        }
        #endregion Public Methods
    }

私有是默认设置。请注意,您可以在字段声明上放置初始值设定项。

没有直接等同于.h / .cpp的区别,尽管存在诸如“部分类”之类的东西,其中给定类的一些成员在一个地方定义,而更多成员在其他地方定义。通常,如果一个类的某些成员由生成的代码定义,而其他成员在手写代码中定义,则完成。

将相关内容(事件处理程序,访问Web服务的方法,等等)放在“区域”中是个好主意:

    #region INotifyPropertyChanged Implementation
    // ...declare methods which implement interface INotifyPropertyChanged
    #endregion INotifyPropertyChanged Implementation

区域不仅仅是一个有趣的注释语法,而是更多:编译器需要#region / #endregion对匹配,并且Microsoft IDE将在折叠/扩展区域的边缘给你一点加号。命名它们是可选的,但是一个非常好的想法,以跟踪什么是什么。你可以嵌套它们,所以你需要跟踪。

我正在明确地初始化所有内容,但是C#对{+ 3}}执行类型的标准默认值:数字类型的默认值为零,任何引用类型的默认值为null等您可以使用default(int)default(string)

获取任何给定类型的值

答案 1 :(得分:2)

这是一个显示C#编码约定的link。这是一个很好的起点,但每家公司都有自己的编码惯例

答案 2 :(得分:2)

using System;
//using ... more stuff as necessary;

public class MyClass
{
    public MyClass()
    {
        // Unlike C++, fields are initialized to zero.
    }

    public MyClass(int n)
    {
         field = n;
    }

    public void method1(int n)
    {
         field = n;
    }

    public int method2()
    {
         return field;
    }

    private int field;
};

答案 3 :(得分:2)

using namespace1;
using namespace2;

namespace MyNamespace
{
    public class MyClass
    {
        //Fields at the top. Private is optional as it is private by default.
        private int field;

        //Properties next
        //This actually replaces your Method properties in your example.
        public int Field 
        { 
            get { return field; }
            set { field = value; }
        }

        //If you don't need special logic, you can use an auto property
        //instead of using a backing field.
        public int SomeProperty {get; set;}

        //Constructor if needed. It is optional.
        public MyClass()
        {
        }

        //Methods next
        public void SomeMethod()
        {
           //Do something
        }

    }
}

每个人都有自己的标准,但这几乎是基本的。