Какой смысл “статического нового” модификатора для функции?

Вы должны использовать предложение ORDER BY FIELD MySQL, чтобы решить эту проблему. Хотя, ответ был принят по этому вопросу, вот лучшее решение.

select 1 id, 'Zeta' order_col union all
select 2 id, 'Alpha' order_col union all
select 3 id, 'Gamma' order_col union all
select 4 id, 'Phi' order_col union all
select 5 id, 'Delta' order_col union all
select 6 id, 'Delta' order_col union all
select 7 id, 'Alpha' order_col union all
select 8 id, 'Gamma' order_col union all
select 9 id, 'Zeta' order_col union all
select 10 id, 'Phi' order_col 
order by field (order_col, 'Alpha', 'Gamma', 'Phi', 'Delta', 'Zeta'), id;

Это лучше, чем

  • id = что-то, порядок по id asc
  • по порядку, когда что-то тогда 1, когда something_else then 2 end desc
30
задан Greg Hewgill 6 September 2009 в 08:34
поделиться

4 ответа

Если Вы удаляете новый от Вашего кода, Вы добираетесь:

предупреждение CS0108: 'Панель. Сделайте ()', скрывает наследованного участника 'Нечто. Сделайте ()'. Используйте новое ключевое слово, если сокрытие было предназначено.

компилятор C# просто предупреждает Вас, что Вы могли бы делать что-то, что Вы не предназначали и просите, чтобы Вы вставили новый ключевое слово, чтобы подтвердить, что Вы знаете то, что Вы делаете. Помимо подавления предупреждения, это не имеет никаких других эффектов.

43
ответ дан Rasmus Faber 27 November 2019 в 23:34
поделиться

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

class Foo
{
    public static void Do() { Console.WriteLine("Foo.Do"); }
}
class Bar : Foo // :Foo added
{
    public static void Something()
    {
        Do();
    }
}

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

class Foo
{
    public static void Do() { Console.WriteLine("Foo.Do"); }
}
class Bar : Foo // :Foo added
{
    public static void Something()
    {
        Do();
    }
    public static new void Do() { Console.WriteLine("Bar.Do"); }
}
13
ответ дан eglasius 27 November 2019 в 23:34
поделиться

взгляните на это

public class BaseC
{
    public static int x = 55;
    public static int y = 22;
}

public class DerivedC : BaseC
{
    // Hide field 'x'.
    new public static int x = 100;

    static void Main()
    {
        // Display the new value of x:
        Console.WriteLine(x);

        // Display the hidden value of x:
        Console.WriteLine(BaseC.x);

        // Display the unhidden member y:
        Console.WriteLine(y);
    }
}
/*
Output:
100
55
22
*/

, Ваш пример, для прояснения, должен быть

public class Foo
{
    public static void Do() {}
}
public class Bar :Foo
{
    public new static void Do() {}
}
7
ответ дан Andreas Niedermair 27 November 2019 в 23:34
поделиться

В Вашем примере Панель второго класса, кажется, не наследовалась от Foo. Это, кажется, опечатка, потому что она не делает имеет смысл иначе.

Принятие, что это опечатка, "новый" модификатор явно скрывает версию базового класса функции Do(). Это означает, что полученная версия Do() метод эффективно заменяет версию базового класса.

Используя "новый" здесь документирует то, что унаследованный метод предназначается как замена для версии базового класса Do().

Для получения дополнительной информации, см. новый Модификатор (C#)

4
ответ дан Cerebrus 27 November 2019 в 23:34
поделиться
Другие вопросы по тегам:

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