Каков эффект исключения размера в nvarchar объявлении

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

, Когда я сначала начал представляться интерфейсам, я также был смущен их уместностью. Я не понял, почему Вам были нужны они. Если мы используем язык как Java или C#, у нас уже есть наследование, и я просмотрел интерфейсы как более слабый форма наследования и думал, "почему беспокойство?" В некотором смысле я был прав, можно думать об интерфейсах как о виде слабой формы наследования, но кроме того я наконец понял их использование в качестве конструкции языка путем размышления о них как о средстве классификации общих черт или поведений, которые были показаны потенциально многими несвязанными классами объектов.

, Например - говорят, что Вы имеете игру SIM и имеете следующие классы:

class HouseFly inherits Insect {
    void FlyAroundYourHead(){}
    void LandOnThings(){}
}

class Telemarketer inherits Person {
    void CallDuringDinner(){}
    void ContinueTalkingWhenYouSayNo(){}
}

Очевидно, эти два объекта не имеют ничего общего с точки зрения прямого наследования. Но, Вы могли сказать, что они являются оба раздражающими.

Скажем, наша игра должна иметь своего рода случайное вещь , который раздражает игровую консоль, когда они едят ужин. Это могло быть HouseFly или Telemarketer или оба - но как Вы допускаете обоих с единственной функцией? И как Вы спрашиваете каждый другой тип объекта "сделать их раздражающую вещь" таким же образом?

ключ для понимания - то, что и Telemarketer и HouseFly совместно используют общее свободно интерпретируемое поведение даже при том, что они - ничто одинаково с точки зрения моделирования их. Так, давайте сделаем интерфейс, который оба могут реализовать:

interface IPest {
    void BeAnnoying();
}

class HouseFly inherits Insect implements IPest {
    void FlyAroundYourHead(){}
    void LandOnThings(){}

    void BeAnnoying() {
        FlyAroundYourHead();
        LandOnThings();
    }
}

class Telemarketer inherits Person implements IPest {
    void CallDuringDinner(){}
    void ContinueTalkingWhenYouSayNo(){}

    void BeAnnoying() {
        CallDuringDinner();
        ContinueTalkingWhenYouSayNo();
    }
}

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

class DiningRoom {

    DiningRoom(Person[] diningPeople, IPest[] pests) { ... }

    void ServeDinner() {
        when diningPeople are eating,

        foreach pest in pests
        pest.BeAnnoying();
    }
}

Здесь у нас есть столовая, которая принимает много небольших ресторанов, и много вредителей - отмечают использование интерфейса. Это означает, что в нашем небольшом мире, члене эти pests массив мог на самом деле быть Telemarketer объект или HouseFly объект.

ServeDinner метод называют, когда обед подан, и наши люди в столовой, как предполагается, едят. В нашей небольшой игре именно тогда наши вредители делают свою работу - каждый вредитель проинструктирован для раздражения посредством эти IPest интерфейс. Таким образом мы можем легко иметь и Telemarketers и HouseFlys быть раздражающими каждым из их собственных способов - мы заботимся только, что у нас есть что-то в эти DiningRoom объект, который является вредителем, мы действительно не заботимся о том, что это, и они могли не иметь ничего общего с другим.

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

18
задан krul 20 September 2016 в 14:33
поделиться

2 ответа

Если вы опустите размер, по умолчанию он будет равен 30. См. Это:

http://msdn.microsoft.com/en-us/library/ms186939.aspx

Чтобы увидеть это в действии, попробуйте выполнить следующие инструкции:

--outputs: 12345678901234567890.098765432 
select cast (12345678901234567890.098765432 as nvarchar)

--throws "Arithmetic overflow error converting expression to data type nvarchar."
select cast (12345678901234567890.0987654321 as nvarchar) 

--outputs: 12345678901234567890.0987654321 
select cast (12345678901234567890.0987654321 as nvarchar(31))

Комментарий Per @ krul; 30 - длина по умолчанию для CAST; однако длина по умолчанию для определения данных или объявления переменной равна 1.

NB: Также существует функция STR , которая преобразует числовые поля в строки, для которых длина по умолчанию равна 10.

--outputs: 1234567890
select str(1234567890)

--outputs: **********
select str(12345678901)

--outputs: 12345678901
select str(12345678901,11)
21
ответ дан 30 November 2019 в 08:27
поделиться

It will set the size to the default size and truncate the rest. This will indeed likely come to bite you, unless the default size is appropriate.

Event then, I would suggest you always specify the size to make it clear what you think the size will be, instead of having the next person that reads to code have to come to SO to ask what the default size of an nvarchar is ;).

5
ответ дан 30 November 2019 в 08:27
поделиться