2014-03-14 2 views
0

Я хотел бы создать метод расширения для класса System.Array, который примет в массиве char[] или byte[] и вернет его длину. Мне нужен этот метод для случая, когда массив имеет значение NULL, и я не хочу засорять код целыми связями (arr == null) ? 0 : arr.Length вызовов.Создать метод расширения Array.ReturnLength()?

Я хочу называть это следующим образом: Array.ReturnLength(arr).

Я попытался реализовать его, но я вижу его только тогда, когда я делаю arr.ReturnLength(), но не как метод массива.

public static int ReturnLength(this Array arr) 
{ 
    if (arr == null) 
     return 0; 
    return arr.Length; 
} 

Любые идеи? Благодарю.

+1

То, что вы хотите сделать, это статический метод расширения. C# это не спорт. Статические методы требуют экземпляра. Вместо этого, поскольку нет реальной синтаксической разницы, используйте свой собственный класс и ставьте там статические методы. –

+2

Вот почему люди используют пустые массивы для представления «нет данных», а не нулей ... т. Е. 'Int [] array = new int [0];' а не 'int [] array = null;' –

+1

Вы: _I только см. его, когда я делаю 'arr.ReturnLength()', _ ​​Что еще вы хотите? Тогда он работает как метод расширения. Каково имя статического класса, в который вы ввели свой метод? Ваш метод является членом этого класса. Ваш метод не является членом 'System.Array' (даже если он« расширяет »' System.Array'). –

ответ

2

Вы можете использовать общий метод расширения:

public static int ReturnLength<T>(this T[] arr) 
{ 
    if (arr == null) 
     return 0; 
    return arr.Length; 
} 

Вы можете использовать его с нулевой ссылкой:

string[] arr = null; 
int length = arr.ReturnLength(); // 0 

Update: но ваш не общий метод расширения должен работать таким же образом, :

public static int ReturnLength(this Array arr) 
{ 
    if (arr == null) 
     return 0; 
    return arr.Length; 
} 

Это работает, потому что ex методы натяжения - это просто синтаксический сахар. На самом деле они являются статическими методами, которые вы могли бы также использовать через имя класса:

int length = MyExtensions.ReturnLength(arr); 

In C#, what happens when you call an extension method on a null object?

+0

Спасибо за ссылку и ответ. Какова была бы причина выбора общего для не-общего метода? – Ionian316

+0

Думаю, в этом случае это не имеет значения. Вам не нужно знать, какой тип 'T', так как единственной необходимой информацией является' Length'. –

1

Как поясняется в комментариях, C# не допускает статических методов расширения. Однако методы расширения - это просто синтаксический сахар, и вы можете назвать их статическими методами вне класса, который они определены в, а не методы экземпляра объекта, который они определены по адресу.

Вы уже знаете, что можете позвонить по своему методу через arr.ReturnLength(). Вы также можете вызвать его через MyExtensionsClass.ReturnLength(arr), где MyExtensionsClass - это статический класс, в котором задан ReturnLength.

+0

Спасибо за быстрый ответ всем. Ты прав. Все, что мне нужно, это 'arr.ReturnLength()'. Он также будет обрабатывать нули. Просто было странно называть его, если 'arr' имеет значение null. – Ionian316

Смежные вопросы