4

私は C# を初めて使用するので、このコードが機能しない理由がわかりません。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            char[] sw = "ab".ToCharArray();
            swap(sw[0], sw[1]);
            string end = new string(sw);
            Console.Write(end);
        }

        static void swap(char a, char b)
        {
            char temp = a;
            a = b;
            b = temp;
        }
    }
}

コンソールで期待するのは「ba」ですが、「ab」が表示されます。この問題を解決するための別のアプローチを見つけることができましたが、知りたいのは、このコードの間違いです。助けてくれてありがとう!

4

5 に答える 5

12

問題は、swapメソッドが実際には と のローカル コピーを操作しているだけでaあることbです。参照によって引数を渡す必要があります。したがって、次のswapようにメソッドを定義します。

    static void swap(ref char a, ref char b)
    {
        char temp = a;
        a = b;
        b = temp;
    }

そして、次のように呼び出します。

    swap(ref sw[0], ref sw[1]);
于 2013-05-11T18:21:49.233 に答える
3

次のように変更する必要があります (注: この例でref char[] arrは、ref主に教訓的な目的で接頭辞が付いています: 配列はrefデフォルトで渡されます)

namespace ConsoleApplication1
{

        class Program
        {
            static void Main(string[] args)
            {
                char[] sw = "ab".ToCharArray();
                swap(0, 1, ref sw );
                string end = new string(sw);
                Console.Write(end);
            }

            static void swap(int indexA, int indexB, ref char[] arr)
            {
                char temp = arr[indexA];
                arr[indexA] = arr[indexB];
                arr[indexB] =temp;
            }
        }
    }
于 2013-05-11T18:24:33.770 に答える
1

スワップは 2 つの値の型を取り、変数間で値を交換しています。元の配列を変更するものは何もありません。swap メソッドを次のように変更する必要があります。

static void Swap(char[] array, int a, int b)
{
    char temp = array[a];
    array[a] = array[b];
    array[b] = temp;
}

次に、次のように Main() から呼び出すことができます。

Swap(array, 0, 1);
于 2013-05-11T18:22:00.737 に答える
0

a引数を値渡ししてbいます。
参照渡しと値渡しの違いを参照してください。詳細については。

問題を解決するための 2 つの解決策を次に示します。

//Pass by value and return the values
static Tuple<char, char> swap2(char a, char b)
{
    char temp = a;
    a = b;
    b = temp;
    return new Tuple<char, char>(a, b);
}

//Pass by reference
static void swap3(ref char a, ref char b)
{
    char temp = a;
    a = b;
    b = temp;
}

public static void Main(string[] args)
{
    char[] sw2 = "ab".ToCharArray();
    var chars2 = swap2(sw2[0], sw2[1]);
    sw2[0] = chars2.Item1;
    sw2[1] = chars2.Item2;
    //Will print "ba"
    Console.WriteLine(sw2);

    char[] sw3 = "ab".ToCharArray();
    swap3(ref sw3[0], ref sw3[1]);
    //Will print "ba"
    Console.WriteLine(sw3);
}

ref キーワードを使用するか、使用しないようにするかについての質問があります。最も単純な使用法は別として、可能な場合は ref を避けるように勧められることがよくあります。スワップは「最も単純な用途」のカテゴリに分類されますが、ほとんどの実際的な状況では ref を使用しないようにすることをお勧めします。
C# ref キーワードを使用するのが良いのはいつですか?

于 2013-05-11T18:20:42.377 に答える