Где я могу поместить мой метод расширения?

21

Старший член здесь дал мне этот код:

public static string Truncate(this string value, int maxChars)
{
    return value.Length <= maxChars ? value : value.Substring(0, maxChars) + " ..";
}

Он сказал, чтобы использовать его как метод расширения. Но где я могу поместить этот метод? Похоже, что он добавляет что-то в .Net

    
задан Melony 17.07.2011 в 18:30
источник
  • Странно, что старший программист предоставит вам фрагмент кода, не объясняя, как его использовать или что это значит. Хорошо, что вы спрашиваете. –  Cody Gray♦ 17.07.2011 в 18:33
  • Коди, возможно, старший программист ожидает, что автор уже это узнает. У нас недостаточно информации, чтобы узнать, разумно ли это или нет. :) –  Joe 17.07.2011 в 18:38
  • Обратите внимание, что этот метод может вырезать строку в середине кода. Не очень хорошо. –  CodesInChaos 17.07.2011 в 18:40
  • Он имел в виду высокопоставленного пользователя SO, а не старшего программиста в своей команде. Смотрите: stackoverflow.com/questions/6724840/... –  CodesInChaos 17.07.2011 в 18:41
  • А, действительно, он это сделал. В этом случае я настоятельно рекомендую использовать подход Ханса в своем ответе на предлагаемый дублирующий вопрос, вместо того, чтобы пытаться обрезать строку самостоятельно. Методы расширения - это хорошо и все, но здесь есть лучшее решение. –  Cody Gray♦ 17.07.2011 в 18:57

4 ответа

29

Рассмотрим класс с именем StringExtensions , например:

static class StringExtensions {
    public static string Truncate(this string value, int maxChars) {
        return value.Length <= maxChars ? 
               value : 
               value.Substring(0, maxChars) + " ..";
    }
}

Убедитесь, что в любом пространстве имен, в которое вы помещаете этот класс, вы включаете объявление using для этого пространства имен.

Таким образом, для полного примера:

StringExtensions.cs :

namespace My.Extensions {
    static class StringExtensions {
        public static string Truncate(this string value, int maxChars) {
            return value.Length <= maxChars ?
                   value :
                   value.Substring(0, maxChars) + " ..";
        }
    }
}

Program.cs :

using System;
using My.Extensions;

namespace My.Program {
    static class Program {
        static void Main(string[] args) {
            string s = "Hello, World";
            string t = s.Truncate(5);
            Console.WriteLine(s);
            Console.WriteLine(t);
        }
    }
}

Кстати, вы не добавляете его в .NET. Вы даже не добавляете новый метод в класс String . Скорее, это трюк компилятора, который статических методов живет в статических классах с их первым параметром, объявленным как this *TypeName* *valueParameter* , где *TypeName* - это имя типа, а *valueParameter* - это имя параметра, которое может отображаться как метод экземпляра для экземпляров типа с именем типа *TypeName* . Это

string t = s.Truncate(5);

переводится компилятором в

string t = StringExtensions.Truncate(s, 5);
    
ответ дан jason 17.07.2011 в 18:32
  • Превосходное использование кода для иллюстрации взаимосвязи между тем, как один вызывает методы расширения и как компилятор просто переводит эти вызовы так, как можно было бы вручную вызвать статический метод. Таким образом, когда вы учитесь со своего поста, нет «волшебства», которое читатель должен найти дальше. –  condiosluzverde 02.03.2018 в 17:54
1

Поместите его в статический класс и используйте using в своем пространстве имен .

например.

namespace Foo
{
    static class Extensions
    {
        public static string Truncate(this string value, int maxChars)
        {
            return value.Length <= maxChars ?
                value : value.Substring(0, maxChars) + " ..";
        }
    }
}

И затем в другом файле :

using Foo;  //Don't forget this!

class Tester
{
    static void Test()
    {
        Console.WriteLine("123456".Truncate(3));
    }
}
    
ответ дан Mehrdad 17.07.2011 в 18:31
  • Можете ли вы привести мне пример? Я не знаю, что я должен назвать классом? –  Melony 17.07.2011 в 18:32
  • Статья MSDN о методах расширения может быть полезна. –  Groo 17.07.2011 в 18:32
0

Да, используйте статический класс. Я организовываю отдельный проект, который я могу использовать для решения. Я также организую отдельные файлы, сгруппированные по тому, что я расширяю, например, строки, перечисления, io, datetime и т. Д.

    
ответ дан Rob A 17.07.2011 в 18:34
0

В дополнение к другим ответам: да, это своего рода расширение .NET. Более строго говоря, расширение уже скомпилированных классов. Вы можете «добавлять» методы к классам, которые недоступны для вашей модификации. С внутренней точки зрения это просто синтаксический сахар: ваши методы не могут быть замечены отражением. Но для пользователей вашего расширения кажется, что методы действительно добавлены в целевой класс (ну, с некоторыми отличиями).

Возможность влиять каким-то образом уже написанный код является неотъемлемой частью объектно-ориентированного подхода. Почти на любом языке OO вы можете получить некоторый существующий класс и добавить к нему некоторые функции (хотя это не является предпочтительным способом повторного использования кода). В Objective C вы можете изменять существующие классы с помощью категорий во время компиляции. В JavaScript вы можете изменять их даже во время выполнения, используя прототип .

Поскольку C # не является таким динамическим языком, как JavaScript, модификация существующих классов доступна в несколько ограниченной форме методов расширения.

    
ответ дан Vlad 17.07.2011 в 18:41