C#: Ошибка компилятора Силы на использовании myObj. ToString ()

Это может быть то, что вы ищете. Он держит кнопку в том же месте.

HTML

<input id="Button" type="button" onclick="showHide('UI');" value="Show UI" />
<div id="UI" style="visibility: hidden">
    <p> Various UI goes here</p>
</div>
<p id="status">Start</p>

JS

function showHide(UI) {
  if (document.getElementById(UI).style.visibility === 'hidden') {
    document.getElementById("status").innerHTML = "Shown";
    document.getElementById(UI).style.visibility = "visible";
    document.getElementById('Button').value = 'Hide UI'
  } else {
    document.getElementById("status").innerHTML = "Hidden";
    document.getElementById(UI).style.visibility = "hidden";
    document.getElementById('Button').value = 'Show UI'
  }
6
задан 20 October 2008 в 15:38
поделиться

7 ответов

Устаревший атрибут позволяет Вам делать это.

[Obsolete("Use the XYZ properties instead of .ToString() on Foobar", true)]

Булевская переменная в конце для того, должен ли компилятор считать использование этого участника ошибкой.

20
ответ дан 8 December 2019 в 02:00
поделиться

Я полностью не соглашаюсь с использованием свойства Obsolete для этого по нескольким причинам.

Запускаться с Вас будет теперь иметь предупреждение для ToString () методом, который Вы переопределили и отметили со свойством Obsolete:

    [Obsolete("dont' use", true)]
    public override string ToString()
    {
        throw new Exception("don't use");
    }

урожаи это предупреждение: Предупреждение 1 Устаревшего участника 'ClassLibrary1. Нечто. ToString ()' переопределяет неустаревшего участника 'объект. ToString ()' d:\source\ClassLibrary1\ClassLibrary1\Class1.cs 11 32 ClassLibrary1

таким образом, теперь Вы застреваете с постоянным предупреждением в Вашем коде. Вдобавок к этому это точно не решает Вашу проблему. Что происходит, когда что-то в платформе неявно называет ToString () теперь? Результат следующего кода состоит в том, что код в теле ToString () все еще называют:

        Foo myObj = new Foo();

        Console.WriteLine(myObj);

Таким образом, теперь у Вас есть предупреждение в Вашем коде, и он на самом деле не препятствует тому, чтобы разработчик делал то же самое снова и снова. Я думаю, что право переезжает сюда, должен попытаться найти способ выдать соответствующее исключение во время выполнения вместо того, чтобы пытаться смешать с контрактами объекта .NET.

Предложение для ловли проблемы во время компиляции: Я понял, что ранее не дал предложение для решения для этой проблемы. Я действительно не знаю, в каком формате Ваш идентификатор находится наверняка, таким образом, я только высказываю предположение в нем являющийся интервалом, но почему бы не защитить то независимо от того, что создает URL с querystring, и передайте идентификатор как интервал. Тем путем разработчик не может случайно передать в некоторой бессмысленной строке без ошибки компиляции. Как это, например:

public string CreateItemUrl(int itemId)
{
   return string.Format("someurl.aspx?id={0}", itemId);
}

Теперь, вызов этого:

CreateItemUrl(myObj.Id);

становится намного более со строгим контролем типов и менее подверженным ошибкам, чем:

string theUrl = string.Format("someurl.aspx?id={0}", myObj);
7
ответ дан 8 December 2019 в 02:00
поделиться

Я не могу подчеркнуть достаточно, как плохо идея этот дизайн.

ToString() часть объектного контракта в .NET. Если Вы не хотите реализовывать его, затем не переопределяют его и просто позволяют ему возвратить информацию о типе. Какой вред мог что возможная причина?

Я не означаю быть столь отрицательным, но я абсолютно поставлен в тупик, что кто-то хотел бы избавиться от ToString().

Некоторые дополнительные точки:

  1. Почему делают программисты, использующие этот класс, принимают это ToString() возвратит идентификатор? Другие классы в Вашей экосистеме делающий это? Можно обсудить это ToString() должен возвратить некоторые значимые данные. Но Вы действительно не должны программировать против результатов a ToString() звонить. ToString() для строковые представления класса, период. Это походит на вопрос образования или проблему связи между программистами или отделами.

  2. Нанесение вреда ToString() всегда, ли можно выяснить, как к во время компиляции или путем выдачи исключения во время выполнения, будет иметь пульсации. Я никогда не видел сделанный и не ожидал бы класса, который я использую для показа этого поведения. Я думаю, что у большинства программистов были бы те же ожидания. Будут будущие программисты, которые используют Ваш класс, ожидают это? Какие ошибки и кошмары обслуживания - Вы вызывающий в будущем?

  3. Что делает влияние это имеет в IDE или отладчике, которые полагаются ToString()?

  4. Какое влияние это окажет при использовании привязки данных технологий, которые не связывают против определенного типа, но используют отражение во времени выполнения для вытаскивания значений? Большая часть привязки данных отступит к вызову ToString() на объекте, если участник не указан для использования.

45
ответ дан 8 December 2019 в 02:00
поделиться

Используйте ключевое слово переопределения с общедоступным ToString () функция для переопределения Системы. Возразите ToString () метод.

1
ответ дан 8 December 2019 в 02:00
поделиться

Я проявил бы гибридный подход. (Эй, не ТАК о расчесывании других ответов?:))

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

public new void ToString() { }

Затем, добавьте Устаревший атрибут поэтому, когда люди ДЕЙСТВИТЕЛЬНО называют его, они получают предупреждение, говоря им, ToString плох.

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

Люди, бросающие для Возражения, не являются беспокойством, если я понимаю вопрос непосредственно. Вы не хотите препятствовать тому, чтобы люди назвали ToString и получили информацию о типе, Вы хотите предотвратить их от случайных взглядов, что ToString обеспечивает полезный результат.

Править: Не выдавайте исключение или переопределяйте ToString. Это вызвало бы "плохие вещи", когда Ваш объект рассматривают как объект. Просто "новое" использование позволяет преимущества, которые Вы попросили, не завинчивая другие платформы.

7
ответ дан 8 December 2019 в 02:00
поделиться

Переопределите ToString к возвращаемой строке. Пустой, затем Вам ничего не добавили бы к строке запроса. По умолчанию, если Вы не переопределите ToString, то Вы получите версию Объекта, которая возвращает это. GetType (), который даст Вам что-то как пространство имен и имя класса.

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

1
ответ дан 8 December 2019 в 02:00
поделиться

Полагайте, что Ваш дизайн/мнение изменяется :)

В первую очередь, определение Foo. ToString не определяет переопределение для Объекта. ToString (), но новый и должен быть снабжен префиксом "новое" ключевое слово для предотвращения неверного толкования семантики. Или явно объявите "переопределение". По моему скромному мнению, компилятор выдает соответствующее предупреждение.

Даже если Вы найдете способ запретить вызов Foo. ToString, будет запрещено во время компиляции только, когда типом "этого", как будет известно, будет Foo, или потомок, но ((объектное) нечто).ToString () будет корректным обходным решением, потому что ToString является методом Интерфейса объекта.

Кроме того, предотвращение вызова ToString является нежелательным, так как Отладчик использует его для представления значения. SY, Jake

0
ответ дан 8 December 2019 в 02:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: