C# 编码约定(C# 编程指南)

1.              命名约定

·         在不包括 using 指令的短示例中,使用命名空间限定。 如果你知道命名空间默认导入项目中,则不必完全限定来自该命名空间的名称。 如果对于单行来说过长,则可以在点 (.) 后中断限定名称,如下面的示例所示。

var currentPerformanceCounterCategory = new System.Diagnostics.

PerformanceCounterCategory();

·        
你不必更改通过使用 Visual Studio 设计器工具创建的对象的名称以使它们适合其他准则。

2.             
布局约定

好的布局利用格式设置来强调代码的结构并使代码更便于阅读。 Microsoft 示例和样本符合以下约定:

·        
使用默认的代码编辑器设置(智能缩进、4 字符缩进、制表符保存为空格)。 有关详细信息,请参阅选项、文本编辑器、C#、格式设置

·        
每行只写一条语句。

·        
每行只写一个声明。

·        
如果连续行未自动缩进,请将它们缩进一个制表符位(四个空格)。

·        
在方法定义与属性定义之间添加至少一个空白行。

·        
使用括号突出表达式中的子句,如下面的代码所示。

if ((val1 > val2) && (val1 > val3))

{

// Take appropriate action.

}

·        
注释约定

·        
将注释放在单独的行上,而非代码行的末尾。

·        
以大写字母开始注释文本。

·        
以句点结束注释文本。

·        
在注释分隔符 (//) 与注释文本之间插入一个空格,如下面的示例所示。

// The following declaration creates a query. It
does not run

// the query.

·        
不要在注释周围创建格式化的星号块。

·        
语言准则

以下各节介绍 C# 遵循以准备代码示例和样本的做法。

1. 
String 数据类型

·        
使用 + 运算符来连接短字符串,如下面的代码所示。

string displayName = nameList[n].LastName + ", " + nameList[n].FirstName;

·        
若要在循环中追加字符串,尤其是在使用大量文本时,请使用 <xref:System.Text.StringBuilder> 对象。

var phrase = "lalalalalalalalalalalalalalalalalalalalalalalalalalalalalala";

var manyPhrases = new StringBuilder();

for (var i = 0; i < 10000; i++)

{

manyPhrases.Append(phrase);

}

//Console.WriteLine("tra" +
manyPhrases);

2. 
隐式类型的局部变量

·        
当变量类型明显来自赋值的右侧时,或者当精度类型不重要时,请对本地变量进行隐式类型化

// When the type of a variable is clear from the
context, use var

// in the declaration.

var var1 = "This is clearly a string.";

var var2 = 27;

var var3 = Convert.ToInt32(Console.ReadLine());

·        
当类型并非明显来自赋值的右侧时,请勿使用
var

// When the type of a variable is not clear from
the context, use an

// explicit type.

int var4 = ExampleClass.ResultSoFar();

·        
请勿依靠变量名称来指定变量的类型。
它可能不正确。

// Naming the following variable inputInt is
misleading.

// It is a string.

var inputInt = Console.ReadLine();

Console.WriteLine(inputInt);

·        
避免使用 var 来代替 dynamic

·        
使用隐式类型化来确定 forforeach 循环中循环变量的类型。

下面的示例在 for 语句中使用隐式类型化。

var syllable = "ha";

var laugh = "";

for (var i = 0; i < 10; i++)

{

laugh += syllable;

Console.WriteLine(laugh);

}

下面的示例在 foreach 语句中使用隐式类型化。

foreach (var ch in laugh)

{

if (ch == ‘h‘)

Console.Write("H");

else

Console.Write(ch);

}

Console.WriteLine();

·        
无符号数据类型

·        
通常,使用 int 而非无符号类型。 int 的使用在整个 C# 中都很常见,并且当你使用 int 时,更易于与其他库交互。

·        
数组

·        
当在声明行上初始化数组时,请使用简洁的语法。

// Preferred syntax. Note that you cannot use var
here instead of string[].

string[] vowels1 = { "a", "e", "i", "o", "u" };

// If you use explicit instantiation, you can use
var.

var vowels2 = new string[] { "a", "e", "i", "o", "u" };

// If you specify an array size, you must
initialize the elements one at a time.

var vowels3 = new string[5];

vowels3[0] = "a";

vowels3[1] = "e";

// And so on.

·        
委托

·        
使用简洁的语法来创建委托类型的实例。

// First, in class Program, define the delegate
type and a method that

// has a matching signature.

// Define the type.

public delegate void Del(string message);

// Define a method that has a matching signature.

public static void DelMethod(string str)

{

Console.WriteLine("DelMethod argument: {0}", str);

}

// In the Main method, create an instance of Del.

// Preferred: Create an instance of Del by using
condensed syntax.

Del exampleDel2 = DelMethod;

// The following declaration uses the full
syntax.

Del exampleDel1 = new Del(DelMethod);

·        
异常处理中的 try-catch 和 using 语句

·        
对大多数异常处理使用 try-catch 语句。

static string GetValueFromArray(string[] array, int index)

{

try

{

return array[index];

}

catch (System.IndexOutOfRangeException ex)

{

Console.WriteLine("Index is out of range: {0}", index);

throw;

}

}

·        
通过使用 C# using 语句简化你的代码。 如果具有 try-finally 语句(该语句中 finally 块的唯一代码是对
<xref:System.IDisposable.Dispose%2A> 方法的调用),请使用 using 语句代替。

// This try-finally statement only calls Dispose
in the finally block.

Font font1 = new Font("Arial", 10.0f);

try

{

byte charset = font1.GdiCharSet;

}

finally

{

if (font1 != null)

{

((IDisposable)font1).Dispose();

}

}

// You can do the same thing with a using
statement.

using (Font font2 = new Font("Arial", 10.0f))

{

byte charset = font2.GdiCharSet;

}

·        
&& 和 || 运算符

·        
若要通过跳过不必要的比较来避免异常并提高性能,请在执行比较时使用
&&(而不是 &),使用 || (而不是 |),如下面的示例所示。

Console.Write("Enter a dividend: ");

var dividend = Convert.ToInt32(Console.ReadLine());

Console.Write("Enter a divisor: ");

var divisor = Convert.ToInt32(Console.ReadLine());

// If the divisor is 0, the second clause in the
following condition

// causes a run-time error. The &&
operator short circuits when the

// first expression is false. That is, it does
not evaluate the

// second expression. The & operator
evaluates both, and causes

// a run-time error when divisor is 0.

if ((divisor != 0) && (dividend / divisor > 0))

{

Console.WriteLine("Quotient: {0}", dividend / divisor);

}

else

{

Console.WriteLine("Attempted division by 0 ends up here.");

}

·        
New 运算符

·        
隐式类型化时,请使用对象实例化的简洁形式,如下面的声明所示。

var instance1 = new ExampleClass();

上一行等同于下面的声明。

ExampleClass instance2 = new ExampleClass();

·        
使用对象初始值设定项来简化对象创建。

// Object initializer.

var instance3 = new ExampleClass { Name = "Desktop", ID = 37414,

Location = "Redmond", Age = 2.3 };

// Default constructor and assignment statements.

var instance4 = new ExampleClass();

instance4.Name = "Desktop";

instance4.ID = 37414;

instance4.Location = "Redmond";

instance4.Age = 2.3;

·        
事件处理

·        
如果你正定义一个稍后不需要删除的事件处理程序,请使用 lambda 表达式。

public Form2()

{

// You can use a lambda expression to define an event handler.

this.Click += (s, e) =>

{

MessageBox.Show(

((MouseEventArgs)e).Location.ToString());

};

}

// Using a lambda expression shortens the
following traditional definition.

public Form1()

{

this.Click += new EventHandler(Form1_Click);

}

void Form1_Click(object sender, EventArgs e)

{

MessageBox.Show(((MouseEventArgs)e).Location.ToString());

}

·        
静态成员

·        
通过使用类名称调用静态成员:ClassName.StaticMember。 这种做法通过明确静态访问使代码更易于阅读。 请勿使用派生类的名称限定基类中定义的静态成员。
编译该代码时,代码可读性具有误导性,如果向派生类添加具有相同名称的静态成员,代码可能会被破坏。

·        
LINQ 查询

·        
对查询变量使用有意义的名称。
下面的示例为位于西雅图的客户使用 seattleCustomers。

var seattleCustomers = from cust in customers

where cust.City == "Seattle"

select cust.Name;

·        
使用别名确保匿名类型的属性名称都使用 Pascal 大小写格式正确大写。

var localDistributors =

from customer in customers

join distributor in distributors on customer.City equals distributor.City

select new { Customer = customer, Distributor =
distributor };

·        
如果结果中的属性名称模棱两可,请对属性重命名。
例如,如果你的查询返回客户名称和分销商 ID,而不是在结果中将它们保留为 Name 和 ID,请对它们进行重命名以明确 Name 是客户的名称,ID 是分销商的 ID。

var localDistributors2 =

from cust in customers

join dist in distributors on cust.City equals dist.City

select new { CustomerName = cust.Name,
DistributorID = dist.ID };

·        
在查询变量和范围变量的声明中使用隐式类型化。

var seattleCustomers = from cust in customers

where cust.City == "Seattle"

select cust.Name;

·        
对齐 from 子句下的查询子句,如上面的示例所示。

·        
在其他查询子句之前使用 where 子句,以确保后面的查询子句作用于经过减少和筛选的数据集。

var seattleCustomers2 = from cust in customers

where cust.City == "Seattle"

orderby cust.Name

select cust;

·        
使用多行 from 子句代替 join子句以访问内部集合。 例如,Student 对象的集合可能包含测验分数的集合。
当执行以下查询时,它返回高于 90 的分数,并返回得到该分数的学生的姓氏。

// Use a compound from to access the inner
sequence within each element.

var scoreQuery = from student in students

from score in student.Scores

where score > 90

select new { Last = student.LastName, score };

来自 <https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/inside-a-program/coding-conventions>

原文地址:https://www.cnblogs.com/pugongying123/p/8322032.html

时间: 2024-11-06 23:34:15

C# 编码约定(C# 编程指南)的相关文章

C# 编码约定(C# 编程指南)——(待续)

原文链接:C# 编码约定(C# 编程指南) 原文地址:https://www.cnblogs.com/panpanwelcome/p/12430116.html

KVC/KVO原理详解及编程指南

http://blog.csdn.net/wzzvictory/article/details/9674431 2.KVC/KVO实现原理 键值编码和键值观察是根据isa-swizzling技术来实现的,主要依据runtime的强大动态能力.下面的这段话是引自网上的一篇文章: http://blog.csdn.net/kesalin/article/details/8194240 当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的

线程同步-iOS多线程编程指南(四)-08-多线程

首页 编程指南 Grand Central Dispatch 基本概念 多核心的性能 Dispatch Sources 完结 外传:dispatch_once(上) Block非官方编程指南 基础 内存管理 揭开神秘面纱(上) 揭开神秘面纱(下) iOS多线程编程指南 关于多线程编程 线程管理 Run Loop 线程同步 附录 Core Animation编程指南 Core Animation简介 基本概念 渲染架构 几何变换 查看目录 中文手册/API ASIHTTPRequest Openg

OC运行时编程指南

一.介绍 OC这个语言尽可能的将一些决定从编译和链接时推迟到运行时.它会尽可能的动态的处理事情.这意味这个语言不仅需要一个编译器,还需要一个运行时系统去执行编译过的代码.这个运行时系统扮演着对于OC这个语言操作系统的的角色,使得这个语言得以运行. 这个教程将探究NSObject这个类以及OC这个语言和运行时系统是如何进行交互的.特别是如何在运行时动态的根据类的范式加载类,并且传递给其他对象.同时这个教程还将告诉你如何在你的程序运行过程中找到你的对象的运行信息. OC运行时编程指南描述了OC运行时

转:KVC/KVO原理详解及编程指南

作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wangzzstrive来支持我,谢谢! 前言: 1.本文基本不讲KVC/KVO的用法,只结合网上的资料说说对这种技术的理解. 2.由于KVO内容较少,而且是以KVC为基础实现的,本文将着重介绍KVC部分. 一.简介 KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NS

Linux音频编程指南

Linux音频编程指南 虽然目前Linux的优势主要体现在网络服务方面,但事实上同样也有着非常丰富的媒体功能,本文就是以多媒体应用中最基本的声音为对象,介绍如何在Linux平台下开发实际的音频应用程序,同时还给出了一些常用的音频编程框架. 一.数字音频 音频信号是一种连续变化的模拟信号,但计算机只能处理和记录二进制的数字信号,由自然音源得到的音频信号必须经过一定的变换,成为数字音频信号之后,才能送到计算机中作进一步的处理. 数字音频系统通过将声波的波型转换成一系列二进制数据,来实现对原始声音的重

CoreAnimation编程指南

转自http://www.cocoachina.com/bbs/read.php?tid=124478 第一章      核心动画概念核心动画是一套包含图形绘制,投影,动画的Objective–C类集合.它通过开发人员所熟悉的应用程序套件和Cocoa Touch视图架构的抽象分层模式,同时使用先进的合作效果提供了一套流畅的动画.动态的动画接口很难创建,但是核心动画通过提供如下接口使这些创建起来变得更加简单:简单易用的高性能混合编程模型.类似视图一样,你可以通过使用图层来创建复杂的接口.轻量级的数

Posix线程编程指南(5)

Posix线程编程指南(5) 杨沙洲 原文地址:http://www.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part5/ 杂项 这是一个关于Posix线程编程的专栏.作者在阐明概念的基础上,将向您详细讲述Posix线程库API.本文是第五篇将向您讲述pthread_self().pthread_equal()和pthread_once()等杂项函数. 在Posix线程规范中还有几个辅助函数难以归类,暂且称其为杂项函数,主要包

Apache Spark 2.2.0 中文文档 - Spark Streaming 编程指南 | ApacheCN

Spark Streaming 编程指南 概述 一个入门示例 基础概念 依赖 初始化 StreamingContext Discretized Streams (DStreams)(离散化流) Input DStreams 和 Receivers(接收器) DStreams 上的 Transformations(转换) DStreams 上的输出操作 DataFrame 和 SQL 操作 MLlib 操作 缓存 / 持久性 Checkpointing Accumulators, Broadcas

Core Animation编程指南

本文是<Core Animation Programming Guide>2013-01-28更新版本的译文.本文略去了原文中关于OS X平台上Core Animation相关内容.因为原文的类型属于编程指南,所以示例代码并不多,更多的是理论层面的探讨.所以译文中加入了大量的示例代码,以提高本文的可操作性.希望本文能够对你有所帮助. 本文由海水的味道翻译,转载请注明译者和出处,请勿用于商业用途! 关于Core Animation Core Animation是iOS与OS X平台上负责图形渲染