C#, 入門チュートリアル (42) - さまざまな括弧 "()[]{}<>" の使用法のまとめ

(ペアの) 括弧は、すべてのプログラミング言語の中心的な要素です。何年も前に、さまざまな括弧についてこのような技術記事を書こうと思いました私はいつも怠け者になりたいので、書き始めていませんが、誰かが書いた場合、私はそれをする必要はありません. 10年以上待ったのに、これ以上理想的な記事がないのは残念です。

1. 括弧 ()

括弧を使用する一般的な方法と一般的でない方法が 5 つあります。

1.1 関数、関数パラメータ、および関数呼び出し

括弧( ) は、関数定義、関数パラメーター リスト、および関数呼び出しを制約するために使用されます。

例えば:

// 函数体
private void function_name() { }
// 函数体及函数列表
private void function_name(int a,ref int b,out double c) { }
// 函数调用
function_name(10,ref b, out double c);

1.2 式(部分式)の計算優先順位

計算式では括弧が最も優先されます。

さまざまな言語が計算の優先順位に同意していますが。例えば:

int b = c * d + e;

* は + よりも優先度が高いことがわかっているため、上記の式は最初に乗算され、次に加算されます。

しかし、このような式の記述方法は、産業用ソフトウェアの製品化要件を満たしていません。また、少し複雑な式は問題が発生しやすく、特にコードのメンテナンスには不向きです。厳密な表現の書き方は次のとおりです。

int c = (c * d) + e;

これは冗長ですか?大規模な商用産業用ソフトウェアの開発に参加していない場合、上記の声明に異議を唱える権利はありません。

式がより複雑な場合は、セクションに分けて記述する必要があります。例えば:

double f = Math.Abs(Math.Sqrt((a * b) + c) - Math.Pow(d, 3.0) + e);

// 某些情况下,也可以写成:
double f1 = Math.Sqrt((a * b) + c);
double f2 = Math.Pow(d, 3.0);
double f3 = e;
double f = Math.Abs(f1 - f2 + f2);

今日から括弧 ( ) を使用する良い習慣を身につけることをお勧めします。

1.3 必須のデータ変換

データ変換は、プログラミングの一般的な方法です。データと変数を正確に定義して使用することは、商用産業ソフトウェアの重要なシンボルです。実験プログラムは次のように記述されます。

var a = 1;

一般に商用産業用ソフトウェアは次のように作成する必要があります. a のデータ型を自分自身とチームメンバーに明確に伝える必要があります:

int a = 1;

データ変換の例はたくさんありますが、ここに少し経験があります。

int a = 16;
// 显式转换,圆括号作为强制类型转换符号
byte b = (byte)a;

優れたプログラマーは覚えておくべきです: キャストが少ないほど良い!

1.4 重要なステートメントの制約

一部のステートメントでは、ループ条件、終了条件、新しいデータ エンティティなどを制約するために括弧が使用されます。

if(a < 10) { ... }
for(int i=0; i<10; i++) { ... }
foreach(int a in list) { ... }
while(i < 10) { ... }
do { ... } while(i < 10);
switch(a) { ... }
try { ... } catch(Exception x) { ... }
using(Log log = new Log()) { ... }
int min = (a < b) ? a : b;

1.5 データの個体識別

特定のデータを検索する場合に便利です。

int a = (1023);
string name = ("panda");

2 つの角括弧 []

角かっこ[ ]は、配列 (ポインター)、インデクサー、およびプロパティに使用されます。

2.1 配列配列

プログラマーは通常、配列の角かっこを理解し始めます。

// 定义一个(整数)数组,并且给出初值
int[] a = new int[10] { 0,1,2,3,4,5,6,7,8,9 };

// 访问数组的第4个元素,第一个元素从0开始
int first = a[0];
int a4 = a[3];

上記は 1 次元配列で、2 次元および多次元配列は次のとおりです。

// 定义二维(整数数组)
int[,] b = new int[2,10] { 
    { 1,2,3,4,5,6,7,8,9,10},
    { 11,12,13,14,15,16,17,18,19,20}
};

// 访问第2列第3行的元素
int u = b[1, 2];

2.2 データ収集 コレクション

リストなどのデータ コレクションではデータ要素へのアクセスに角かっこ [インデックス] を使用することもできます。

// 定义一个(整数列表),并初始化
List<int> c = new List<int>() { 1, 2, 3};

// 访问第2个元素
int c2 = c[1];

2.3 インデクサー インデクサー

インデクサーを使用して、配列のような方法でオブジェクトにインデックスを付け、対応するデータにアクセスして割り当てることができます。配列添字は、インデクサーの簡略化されたバージョンとして理解できます。

// 定义了索引器的类
class SampleIndxer
{
    // 可供索引器使用的容器(数组或其他数据类型)
    private string[] sampleStrArr = new string[10];
    // 创建索引器 ***
    public string this[int i]
    {
        get { return sampleStrArr[i]; }
        set { sampleStrArr[i] = value; }
    }
}

// 使用索引器访问数据
public void Drive()
{
    // 简单索引器测试
    SampleIndxer sit = new SampleIndxer();
    sit[0] = “测试数据0”;
    sit[1] = “测试数据1”;
}

int に加えて、string やその他のタイプのデータをインデックス (値) として使用することもできます。

2.4 辞書、ハッシュ辞書、ハッシュテーブル

角括弧は、ディクショナリ クラスおよびハッシュ テーブル データにアクセスする一般的な形式でもあります。

Hashtable hash = new Hashtable();
hash.Add("number_01", 1);
int va = (int)hash["number_01"];

辞書、類似。

// 字典的定义
Dictionary<string, string> app = new Dictionary<string, string>();

// 添加字典元素
app.Add("txt", "notepad.exe");
app.Add("bmp", "paint.exe");
app.Add("dib", "paint.exe");
app.Add("rtf", "wordpad.exe");
app.Add("png", "picture.exe");

// 访问字典元素
string a = app["png"]; // "picture.exe"

2.5 属性定義 属性

プロパティ定義は、宣言情報を C# コード (型、メソッド、プロパティなど) に関連付ける強力な方法を提供します。プロパティがプログラム エンティティに関連付けられると、リフレクションと呼ばれる手法を使用して実行時にクエリを実行できます。

プロパティには、共通言語ランタイムの基本クラス ライブラリで定義されたプロパティと、コードに追加情報を追加するために作成できるカスタム プロパティの 2 つの形式があります。この情報は、後でプログラムによって取得できます。

[Serializable]
public class HumanInfo
{
    public int Id { get; set; } = -1;
    public string Name { get; set; } = "";
    public int Age { get; set; } = 0;
    public int Gender { get; set; } = 1;
}

3.中括弧 {}

中括弧{ }は、C# でいくつかの非常に重要で異なる役割を果たします。

一般に、著者の実際のプログラミング レベルは、中括弧を使用する著者の習慣を見ることで知ることができます。

3.1 合意されたコード階層 (名前空間とクラスを定義するときに使用される中括弧など)

中括弧の主な機能は、プログラムの階層を厳密に分割することであり、階層のないコードを維持することは非常にコストがかかります。中括弧で囲まれた部分がレベルです。

中括弧で区切られたレベルは、ローカル変数のスコープも制限します。これは非常に重要です! 非常に!非常に!重要!このレベルで定義された変数は、中括弧の外側ではなく、中括弧内でのみ使用できます。

下面这段代码,无法通过编译!报错!

for(int i=0; i<10; i++)
{
    int x = i * 2;
    int y = i * 3;
}

int x = 20;
int y = 30;

应该写成:

for(int i=0; i<10; i++)
{
    int x = i * 2;
    int y = i * 3;
}

{
    int x = 20;
    int y = 30;
}

同样的情况,常常出现于 switch,比如下面的代码编译错误 :

switch(a) 
{
    case 1:
        int x = a * 10;
        break;
    case 2:
        int x = a * 20;
        break;
}

两个 x 的定义是冲突的。下面的代码就可以:

switch(a) 
{
    case 1:
        {
            int x = a * 10;
            break;
        }
    case 2:
        {
            int x = a * 20;
            break;
        }
}

有一些编程语言放弃了大括号,其代码的可维护性极其低下,团队开发效率极低,导致无法在商业化的工业软件中获得深度认可。

3.2 表示复合语句(如if、for中的大括号)

这个没什么要说的,看代码吧:

if(a < b)
{
    return a;
}

for(int i=0; i<10; i++)
{
    x += i;
}

3.3数组、列表等数据集的初始化(元素)

看代码(数组、列表等等均可以这样初始化)。

string[] words = new string[3] { "hello", "world", "!" };

3.4 格式字符串

格式字符串是数据按格式生成的描述。

string result = String.Format("a = {0}", a);

各种数据在输出的时候,都需要按一定格式予以处置。格式化的方法很多,尤其是时间、浮点数等细节较多,建议搜索其他文章阅读。

3.5 内插(插入字符串InsertString)

$ 特殊字符将字符串文本标识为内插字符串。 内插字符串是可能包含内插表达式的字符串文本。 将内插字符串解析为结果字符串时,带有内插表达式的项会替换为表达式结果的字符串表示形式。 此功能在 C# 6 及该语言的更高版本中可用。与使用字符串复合格式设置功能创建格式化字符串相比,字符串内插提供的语法更具可读性,且更加方便。

string name = "Earth";
DateTime date = DateTime.Now;
MessageBox.Show($"Hello, {name}!\ntime:{date}");

四、尖括号<>

尖括号<> 用于指定类、泛型集合 和 xml注释信息。

4.1 泛型

泛型允许我们延迟编写类或者方法中的编程元素的数据类型的规范,直到实际在程序中使用他的时候。(也就是说泛型是可以与任何数据类型一起工作的类或方法)模块内高 内聚,模块间低耦合。在C#中提供了5种泛型:类、结构、接口、委托和方法,前面的4种是类型,而方法是成员。泛型的使用:当我们的类/方法不需要关注调用者传递的实体是什么(公共基类工具类)的时候,就可以使用泛型。

大家可以简单理解泛型是一种数据模板。

// 单泛型
public static void ShowClass<T>(T t) where T : class
{
}

// 多泛型
public static void ShowClass<S, T>(S s, T t) where S : Person
{
}

4.2 XML注释

大家都知道,尖括号<> 是 XML 的基本字符框架。C#中 XML 用于注释。

除了C风格的注释外,C#还可以根据特定的注释自动创建XML格式的文档说明。这些注释都是单行注释,但都以3个斜杠 /// 开头,而不是通常的两个斜杠。在这些注释中,可以把包含类型和类型成员的文档说明的XML标识符放在代码中。编译器可以识别的标识符如下:

标识符 说明

<c> 把行中的文本标记为代码,例如:<c>int i=10;</c>

<code> 把多行标记为代码

<example> 标记为一个代码示例

<exception> 说明一个异常类(编译器要验证其语法)

<include> 包含其他文档说明文件的注释(编译器要验证其语法)

<list>把列表插入到文档说明中

<param> 标记方法的参数(编译器要验证其语法)

<paramref> 表示一个单词是方法的参数(编译器要验证其语法)

<permission> 说明对成员的访问(编译器要验证其语法)

<remarks> 给成员添加描述

<returns> 说明方法的返回值

<see> 提供对另一个参数的交叉引用(编译器要验证其语法)

<seealso> 提供描述中的“参见” 部分(编译器要验证其语法)

<summary> 提供类型或成员的简短小结

<value> 描述属性

/// <summary>
/// 计算 block 实际有效范围(begin...end)
/// block is in {} or {};
/// </summary>
/// <param name="begin"></param>
/// <param name="end"></param>
private void Segment_Region(ref int begin, ref int end)
{
    if (begin < 0) begin = 0;
    Token tx = Tokens[begin];
    while (tx != Tokens[begin] && tx != null && tx.Buffer != "{") tx = tx.Right;
    if (tx.Buffer == "{") begin = tx.Right.Id;

    if (end <= begin) return;
    Token ty = Tokens[end];
    while (ty != Tokens[begin] && ty != null && ty.Buffer != "}") ty = ty.Left;
    if (ty.Buffer == "}") end = ty.Left.Id;
}

C#编译器可以把XML元素从特定的注释中提取出来,并使用它们生成一个XML文件。

没想到哩哩啦啦写了这么多话,自己都嫌啰嗦,大家凑合看吧。

遗漏的请大家补充则个。

おすすめ

転載: blog.csdn.net/beijinghorn/article/details/129599478