1

たとえば List のようなオブジェクトを関数に渡しています。

この関数が実際に List/Array/etc の内容を変更することを呼び出し元に示すにはどうすればよいですか?

現時点では、関数のコメントに入れています。それを示す「正式な」方法はありますか?

4

2 に答える 2

1

残念ながら正式な方法はありません。

あなたができる最善の方法は、IEnumerable<T>代わりにパラメーターの型を作成することです (可能な場合)。または、 or を使用ReadOnlyCollection<T>して、メソッドがリストを変更しないIReadOnlyList<T>ことを表現することもできます (求めているものとは逆です)。

を使用する場合、配列またはリストを渡す場合、呼び出し元はパラメーターを変換する必要がないことに注意してくださいIReadOnlyList<T>。これは非常に便利です。

using System;
using System.Collections.Generic;

namespace Demo
{
    class Program
    {
        void run()
        {
            List<int> list = new List<int> {1};
            test(list); // Caller can just pass list, although method accepts IReadOnlyList<int>

            int[] array = new int[10];
            test(array); // Works with arrays too.
        }

        void test(IReadOnlyList<int> data)
        {
            Console.WriteLine(data.Count);
        }

        static void Main(string[] args)
        {
            new Program().run();
        }
    }
}

IReadOnlyList<T> 考えてみれば、使用はこれを表現するための正式な形式的な方法であるとまで言えます。

しかし、これはあなたが求めていたものとは反対です。メソッドが渡されたリストを変更しないことを示しています。残念ながら、メソッドがリストを変更することを正式に表現する方法は絶対にありません(メソッドを文書化する以外に)。

特に明記されていないドキュメントがない場合は、どのメソッドでも渡されたリストが変更される可能性があると想定する必要があります。

于 2013-09-19T09:45:34.753 に答える
0

これが正式かどうかはわかりませんが、次のようなコード コントラクトを使用できます

Contract.Ensures(((IArray)arr).Count != Contract.OldValue(((IArray)arr).Count));

また

Contract.Ensures(Contract.Result<IArray>() != ....

あなたのニーズに依存します。

私は実際に単体テストが最も正式な方法だと考えています:)

于 2013-09-19T09:56:21.917 に答える