C# 6.0, nameof(private property)
От: StatujaLeha на правах ИМХО
Дата: 13.02.17 16:29
Оценка:
Не пойму, чего nameof() ругается...
Как сделать, чтобы работало?

using System;
using System.Collections.Generic;
using System.Linq;

class A
{
    private int X { get { return 1; } }
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(nameof(A.X));//CS0122
    }
}


http://volatileread.com/utilitylibrary/snippetcompiler?id=106470
Отредактировано 13.02.2017 17:29 AndrewVK . Предыдущая версия .
c# c# 6
Re: C# 6.0, nameof(private property)
От: Doc Россия http://andrey.moveax.ru
Дата: 13.02.17 17:11
Оценка:
Здравствуйте, StatujaLeha, Вы писали:

SL>Не пойму, чего nameof() ругается...


А почему вы решили что private должен быть доступен вне класса?
Re: C# 6.0, nameof(private property)
От: nikov США http://www.linkedin.com/in/nikov
Дата: 13.02.17 17:40
Оценка: +1
Здравствуйте, StatujaLeha, Вы писали:

SL>Не пойму, чего nameof() ругается...

Видимость членов класса, упоминаемых в nameof, подчиняется тем же правилам, что и обычное обращение к членам класса. То есть private свойство будет доступно только внутри того класса, в котором оно объявлено.

SL>Как сделать, чтобы работало?

Использовать обычный строковый литерал, или сделать свойство public, или перенести nameof внутрь того класса, где объявлено свойство (например, поместить его в public метод, который может быть вызван снаружи).
Re[2]: C# 6.0, nameof(private property)
От: StatujaLeha на правах ИМХО
Дата: 13.02.17 17:40
Оценка:
Здравствуйте, Doc, Вы писали:

nameof(A.X) -> "X". Делает это в compile-time.
Чего бы ему и не быть доступным? Я же не значение из поля беру, а его имя в виде строки.
Re[3]: C# 6.0, nameof(private property)
От: nikov США http://www.linkedin.com/in/nikov
Дата: 13.02.17 17:46
Оценка: +3
Здравствуйте, StatujaLeha, Вы писали:

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


А какая разница? Объявление члена класса private означает, он является не частью публичного контракта, а скрытой деталью реализации, и может менять своё поведение, смысл, название, а также может быть вообще удалён, и это никак не должно требовать менять что-то в коде клиентов этого класса. Использование nameof для private члена класса очевидно нарушает это соглашение.
Re[4]: C# 6.0, nameof(private property)
От: StatujaLeha на правах ИМХО
Дата: 13.02.17 17:51
Оценка:
Здравствуйте, nikov, Вы писали:

N>А какая разница? Объявление члена класса private означает, он является не частью публичного контракта, а скрытой деталью реализации, и может менять своё поведение, смысл, название, а также может быть вообще удалён, и это никак не должно требовать менять что-то в коде клиентов этого класса. Использование nameof для private члена класса очевидно нарушает это соглашение.


Все так, по этому вопросов нет.

Моя ситуация: есть именованная magic константа, нужно иметь к ней доступ из unit-теста.
Re[5]: C# 6.0, nameof(private property)
От: nikov США http://www.linkedin.com/in/nikov
Дата: 13.02.17 18:08
Оценка: 4 (1) +4
Здравствуйте, StatujaLeha, Вы писали:

SL>Моя ситуация: есть именованная magic константа, нужно иметь к ней доступ из unit-теста.


Можно сделать свойство internal и дать сборке с unit-тестами доступ с помощью [assembly: InternalsVisibleTo("...")]. Но стоит подумать, действительно ли unit-тесты нужно делать зависимыми от деталей реализации. Может быть, magic константу нужно сделать частью публичного контракта.
Re: C# 6.0, nameof(private property)
От: _NN_ www.nemerleweb.com
Дата: 13.02.17 18:14
Оценка:
Здравствуйте, StatujaLeha, Вы писали:

SL>Не пойму, чего nameof() ругается...

SL>Как сделать, чтобы работало?
Озвучьте исходную задачу.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: C# 6.0, nameof(private property)
От: StatujaLeha на правах ИМХО
Дата: 13.02.17 19:04
Оценка:
Здравствуйте, _NN_, Вы писали:

Внутри класса есть деталь реализации в виде magic constant. Юзеру она не нужна: собственно класс как раз все эти детали реализации от него и скрывает.
Но мне она нужна для написания unit-теста.
План был такой:
protected static readonly PrivateType _MyType = new PrivateType(typeof(MyType));

public static int ValueInt => (int)_MyType .GetStaticFieldOrProperty("Value");
Re[6]: C# 6.0, nameof(private property)
От: StatujaLeha на правах ИМХО
Дата: 13.02.17 19:06
Оценка:
Здравствуйте, nikov, Вы писали:

N>Можно сделать свойство internal и дать сборке с unit-тестами доступ с помощью [assembly: InternalsVisibleTo("...")]. Но стоит подумать, действительно ли unit-тесты нужно делать зависимыми от деталей реализации. Может быть, magic константу нужно сделать частью публичного контракта.


Там идет работа с проверкой сериализации данных в некоторый формат.
Magic constant-а спрятана, юзеру она не нужна.
Думаю, вариант с InternalsVisibleTo сойдет.

Тут чуть подробнее про исходную задачу: http://rsdn.org/forum/dotnet/6697431.1
Автор: _NN_
Дата: 13.02.17
Re[5]: C# 6.0, nameof(private property)
От: Doc Россия http://andrey.moveax.ru
Дата: 14.02.17 04:54
Оценка: +2
Здравствуйте, StatujaLeha, Вы писали:

SL>Моя ситуация: есть именованная magic константа, нужно иметь к ней доступ из unit-теста.


Что-то здесь не правильно. Тест не должен полагаться на внутренние детали реализации.
Т.е имеем входные данные, зависимости (mocks) и ожидаемый результат. И все. Никаких private.

Я бы пересмотрел такой тест.
Re[3]: C# 6.0, nameof(private property)
От: _NN_ www.nemerleweb.com
Дата: 14.02.17 08:20
Оценка:
Здравствуйте, StatujaLeha, Вы писали:

SL>Здравствуйте, _NN_, Вы писали:


SL>Внутри класса есть деталь реализации в виде magic constant. Юзеру она не нужна: собственно класс как раз все эти детали реализации от него и скрывает.

SL>Но мне она нужна для написания unit-теста.
Что тестируется то ?
Как вариант вынести эту константу в отдельный internal класс, который будет доступен тесту через InternalsVisibleTo как предлагали раньше.

Советую почитать: Как тестировать закрытые методы?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: C# 6.0, nameof(private property)
От: StatujaLeha на правах ИМХО
Дата: 14.02.17 08:52
Оценка:
Здравствуйте, Doc, Вы писали:

Тестируем бинарную сериализацию. Формат сериализации определен не нами.
Есть байт с флагами. Когда оба флага убраны, то значение не нулевое — это и есть magic constant.
В тесте и нужно проверить, что когда оба флага убраны, то значение байта magic constant.
Отредактировано 14.02.2017 8:55 StatujaLeha . Предыдущая версия .
Re[4]: C# 6.0, nameof(private property)
От: StatujaLeha на правах ИМХО
Дата: 14.02.17 08:54
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Что тестируется то ?


Тестируем бинарную сериализацию. Формат сериализации определен не нами.
Есть байт с флагами. Когда оба флага убраны, то значение не нулевое — это и есть magic constant.
В тесте и нужно проверить, что когда оба флага убраны, то значение байта magic constant.

_NN>Как вариант вынести эту константу в отдельный internal класс, который будет доступен тесту через InternalsVisibleTo как предлагали раньше.


Сделал константу internal static readonly + InternalsVisibleTo.
Отредактировано 14.02.2017 8:55 StatujaLeha . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.