如果我没有弄错,用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 ++,请修复它以帮助防止混淆未来的读者。
答案 0 :(得分:5)
在C#中,所有声明都是内联的,每个成员声明中都包含“private”和“public”等访问说明符;在C#中,public
,private
,protected
和internal
是成员的修饰符,就像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
}
}
}
每个人都有自己的标准,但这几乎是基本的。