явный и неявный c#

Действительно ли возможно иметь для дисплея 4 отдельных поля (Код зоны, 3-разрядный префикс, 4 части цифры, расширение) так, чтобы они могли ввести каждую часть адреса отдельно, и можно ли проверить каждую часть индивидуально? Тем путем можно не только сделать проверку намного легче, можно сохранить номера телефона в более последовательном формате в базе данных.

59
задан Joey 24 July 2009 в 09:54
поделиться

6 ответов

Ключевые слова implicit и explicit в C # используются при объявлении операторов преобразования. Допустим, у вас есть следующий класс:

public class Role
{
    public string Name { get; set; }
}

Если вы хотите создать новую роль и присвоить ей Имя , вы обычно делаете это следующим образом:

Role role = new Role();
role.Name = "RoleName";

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

Role role = "RoleName";

Это означает, что мы хотим неявно преобразовать строку в Роль ( поскольку в коде нет конкретного приведения). Для этого мы добавляем оператор неявного преобразования:

public static implicit operator Role(string roleName)
{
    return new Role() { Name = roleName };
}

Другой вариант - реализовать оператор явного преобразования:

public static explicit operator Role(string roleName)
{
    return new Role() { Name = roleName };
}

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

Role r = (Role)"RoleName";
115
ответ дан 24 November 2019 в 18:02
поделиться

В целом

  • Неявно: что-то делается за вас автоматически.
  • Явно: вы написали что-то в исходном коде, чтобы указать, что вы хотите сделать.

Например:

int x = 10;
long y = x; // Implicit conversion from int to long
int z = (int) y; // Explicit conversion from long to int

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

Обратите внимание, что иногда они могут совпадать. Например:

int x = 10;
long y = (long) x; // Explicit use of implicit conversion!

(Явное преобразование - это преобразование, для которого должно быть явно указано ; неявная версия - это преобразование, которое может использоваться неявно, т. Е. Без указания кода .)

56
ответ дан 24 November 2019 в 18:02
поделиться

Предположим, у вас есть два класса:

internal class Explicit
{
    public static explicit operator int (Explicit a)
    {
        return 5;
    }
}


internal class Implicit
{
    public static implicit operator int(Implicit a)
    {
        return 5;
    }
}

и два объекта:

var obj1 = new Explicit();
var obj2 = new Implicit();

теперь вы можете написать:

int integer = obj2; // implicit conversion - you don't have to use (int)

или:

int integer = (int)obj1; // explicit conversion

но:

int integer = obj1; // WON'T WORK - explicit cast required

Неявное преобразование предназначено для использования, когда преобразование не теряет точности. Явное преобразование означает, что вы можете потерять некоторую точность и должны четко заявить, что знаете, что делаете.

Существует также второй контекст, в котором применяются неявные / явные термины - реализация интерфейса. В этом случае нет ключевых слов.

internal interface ITest
{
    void Foo();
}

class Implicit : ITest
{
    public void Foo()
    {
        throw new NotImplementedException();
    }
}

class Explicit : ITest
{
    void ITest.Foo() // note there's no public keyword!
    {
        throw new NotImplementedException();
    }
}

Implicit imp = new Implicit();
imp.Foo();
Explicit exp = new Explicit();
// exp.Foo(); // won't work - Foo is not visible
ITest interf = exp;
interf.Foo(); // will work

Поэтому, когда вы используете явную реализацию интерфейса, методы интерфейса не видны, когда вы используете конкретный тип.

9
ответ дан 24 November 2019 в 18:02
поделиться

Я думаю эта ссылка довольно ясно показывает, что такое неявное преобразование - это такое, в котором вам не нужно явно приводить значение в присваивании. Итак, вместо

myDigit = (Digit) myDouble 

... вы можете просто сделать:

myDigit = myDouble;
2
ответ дан 24 November 2019 в 18:02
поделиться

Явность в C # в основном заключается в том, чтобы ясно и недвусмысленно показать ваши намерения.

Например:

class MyClass
{
    string myField;

    void MyMethod(int someNumber)
    {

    }
}

В приведенном выше коде подразумевается видимость класса, поля и метода. Они используют значения по умолчанию для компилятора.

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

public class MyClass
{
    private string myField;

    public void MyMethod(int someNumber)
    {
    }
}
1
ответ дан 24 November 2019 в 18:02
поделиться
Другие вопросы по тегам:

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