Глобальное определение функции в C#

У меня есть две функции, которые я, кажется, довольно часто включаю в программное обеспечение для преобразования строк и массивов байтов между типами. Использование примерно такое:

string str = "Hello world";
byte[] b = strToByteArray(str);

Во-первых, есть ли способ включить это в пространство имен System, чтобы мне больше не нужно было определять его в коде?

Во-вторых, есть ли способ определить его как часть класса строки, поэтому использование будет больше похоже на:

string str = "Hello world";
byte[] b = str.ToByteArray();

person Ali3nat0r    schedule 30.05.2012    source источник
comment
1) Скомпилируйте ваши часто используемые служебные методы в DLL. 2) Повторно используйте DLL. 3) ???   -  person Anthony Pegram    schedule 30.05.2012
comment
Обратите внимание, что ваша функция имеет смысл только при определенной кодировке. Остерегайтесь ужасов Unicode!   -  person SLaks    schedule 30.05.2012
comment
Просто сделайте метод статическим....   -  person Security Hound    schedule 30.05.2012


Ответы (8)


То, о чем вы просите, предоставляется на C# с помощью методов расширения.

person David    schedule 30.05.2012
comment
Методы расширения могут добавлять только методы экземпляра в существующий класс. Если вам нужен почти глобальный метод (без экземпляра), вам нужно создать класс со статическим методом - person Steve B; 30.05.2012
comment
Вы можете расширить строку и байт [];) - person TomTom; 30.05.2012
comment
@SteveB На самом деле вы также можете вызывать метод расширения статически: Extensions.MyExtension("some string") вместо "some string".MyExtension(). @TomTom string - это sealed, а byte[] недопустим в качестве базового типа, поэтому вы не можете этого сделать. - person Tim S.; 30.05.2012

Почему вы не используете System.Text.Encoding.Unicode.GetBytes?

Во-первых, есть ли способ включить это в пространство имен System, чтобы мне больше не нужно было определять его в коде?

Я не знаю, что вы подразумеваете под «определить это больше в коде». Вы можете добавить в System все, что хотите, но обычно это осуждается. Просто скажи

namespace System {
    // add classes here
}

C# не имеет методов верхнего уровня, как вам кажется. Эрик Липперт обсуждал это раньше.

Во-вторых, есть ли способ определить его как часть класса строки, поэтому использование будет больше похоже на:

Я полагаю, что вы могли бы определить метод расширения для string:

public static class StringExtensions {
    public static byte[] GetBytes(this string s) {
        // do something and return byte[]
    }
}

Если хотите, поместите его в пространство имен System. Опять же, это обычно осуждается, и вам все равно придется ссылаться на сборку, содержащую определение.

person jason    schedule 30.05.2012
comment
Спасибо, методы расширения - это то, что мне было нужно. Под определением его в коде я имел в виду добавление его в стандартные включения, поэтому мне не нужно добавлять его в каждый новый проект. - person Ali3nat0r; 30.05.2012

Не изобретайте велосипед, используйте кодирование класс вместо этого.

person Jakub Konecki    schedule 30.05.2012

  1. Нет; C# не поддерживает функции верхнего уровня.

  2. Вы ищете методы расширения.

person SLaks    schedule 30.05.2012

Вы можете написать метод расширения для строки, который делает то, что вам нужно: http://csharp.net-tutorials.com/csharp-3.0/extension-methods/

а затем вы можете просто вызвать его с каждой строкой:

byte[] b = "Hello world".ToByteArray();

кстати для реализации можно использовать Encoding.GetBytes

person eyossi    schedule 30.05.2012

Все, что вам нужно, — это собственный метод расширения в пространстве имен System.

namespace System
{
    public static class StringExtensions
    {
        public static byte[] ToByteArray(this string source)
        {
            // return result
        }
    }
}
person archil    schedule 30.05.2012

Дополнительную информацию см. в разделе Зачем использовать ключевое слово global в C#?... Вы Вы можете добавить оператор using для достижения семантики, которую вы ищете, или вы можете использовать ключевое слово global.

person Jay    schedule 30.05.2012

Во-первых, есть ли способ включить это в пространство имен System, чтобы мне больше не нужно было определять его в коде?

??? Чего ты хочешь?

Системное пространство имен? Поместите их в (статический) калас в пространстве имен системы. Пространства имен не имеют НИЧЕГО общего со сборками, dll и т. д. — вы можете использовать все, что захотите.

В противном случае сделайте то, что делает большинство людей — начните проект с классов инструментов. У меня есть некоторые из них, которые я использую для общего кода.

person TomTom    schedule 30.05.2012