C#」カテゴリーアーカイブ

プログラミング言語「C#」に関するカテゴリーです。

C#の配列をコピーする方法

Cloneメソッド

Cloneメソッドを使うと簡単に配列のコピーができます。

使い方は次のような感じです。

using System;

public class Example1
{
  static public void Main ()
  {
    string[] ar1 = { "aaa", "bbb", "ccc" };
    string[] ar2 = (string[])ar1.Clone();

    ar2[0] = "AAA";

    Console.WriteLine("ar1:");
    foreach(var e in ar1) Console.WriteLine(e);
    
    Console.WriteLine("ar2:");
    foreach(var e in ar2) Console.WriteLine(e);
  }
}

実行結果

ar1:
aaa
bbb
ccc
ar2:
AAA
bbb
ccc

多次元配列

多次元配列でも同様にCloneできます。

using System;

public class Example2
{
  static public void Main ()
  {
    string[,] ar1 = { {"aaa", "bbb"}, {"ccc", "ddd"} };
    string[,] ar2 = (string[,])ar1.Clone();

    ar2[0,0] = "AAA";

    Console.WriteLine("ar1:");
    foreach(var e in ar1) Console.WriteLine(e);
    
    Console.WriteLine("ar2:");
    foreach(var e in ar2) Console.WriteLine(e);
  }
}

実行結果

ar1:
aaa
bbb
ccc
ddd
ar2:
AAA
bbb
ccc
ddd

shallow copy

Cloneメソッドは便利ですが、deep copyではなくshallow copyになっている点には注意してください。

using System;

public class C
{
  public string s;
  public override string ToString() => s;
}

public class Example3
{
  static public void Main ()
  {
    C c = new C();
    c.s = "aaa";
	
    C[] ar1 = { c, c };
    C[] ar2 = (C[])ar1.Clone();

    ar2[0].s = "AAA";

    Console.WriteLine("ar1:");
    foreach(var e in ar1) Console.WriteLine(e);

    Console.WriteLine("ar2:");
    foreach(var e in ar2) Console.WriteLine(e);
  }
}

実行結果

ar1:
AAA
AAA
ar2:
AAA
AAA

リンク

Array.Clone Method (System) | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/api/system.array.clone?view=netcore-3.1

C#でgotoの使い方

forステートメント

C#でforの2重ループから抜けたい時、gotoステートメントを使って次のような書き方ができるみたいです。

サンプルコード

using System;

public class Example
{
  static public void Main ()
  {
    for (int i = 0; i < 5; ++i)
    {
      for (int j = 0; j < 5; ++j)
      {
        Console.WriteLine($"i={i}, j={j}");
        if (i + j > 5) goto Finish;
      }
    }

    Finish:
      Console.WriteLine("Finish");
  }
}

実行結果

i=0, j=0
i=0, j=1
i=0, j=2
i=0, j=3
i=0, j=4
i=1, j=0
i=1, j=1
i=1, j=2
i=1, j=3
i=1, j=4
i=2, j=0
i=2, j=1
i=2, j=2
i=2, j=3
i=2, j=4
Finish

switchステートメント

他にも、switchステートメントで

switch (n)
{
  case 1:
    // 実行したい内容1
    break;
  case 2:
    // 実行したい内容2
    goto case 1;
  default
    break;
}

のような書き方もできるみたいです。

慣れないと戸惑いそうですが、覚えておくと便利そうな気がします。

リンク

goto statement – C# Reference | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/goto

C#でグローバルな定数を扱いたい時

C#でグローバルな定数を扱いたい時、いろいろな方法があると思いますが、static classusing staticを使うという方法があります。

使い方は次のような感じです。

定数の定義

static class Value
{
  public const int size = 10;
}

定数の使い方

using System;
using static Value;

class Example
{
  static public void Main ()
  {
    Console.WriteLine($"size = {size}");
  }
}

using staticを使うとクラス名.の部分が省略でき、見やすくなるので便利です。

リンク

using static directive – C# Reference | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-static