VistaDB имеет специальную версию, которая является бесплатной использовать и является синтаксисом и драйвером, совместимым с SQL Server. VistaDB является единственным файлом и только требует, чтобы их драйвер .dll работал в Вашем asp.net или проекте winforms.
, Так как это - синтаксис и источник данных, совместимый, можно обновить до SQL Server в случае необходимости.
от их сайта:
VistaDB является полностью управляемый и безопасный с точки зрения типов ASP.NET и приложения WinForms с помощью C#, VB.NET и других совместимых CLR языков.
Я думаю, что классы хорошо спроектированы. Я бы предпочел проверить свойство, а затем попытаться что-то сделать и поймать исключение. Интерфейсы не работают в случае типов потоков, которые относятся к нескольким «типам». Какой тип будет возвращен из метода, который дает вам доступный для чтения и записи поток? Я согласен, что это не настоящий объектно-ориентированный дизайн, но действительно ли вы хотите обрабатывать потоки таким образом? Некоторые свойства могут измениться, если поток закрыт или что-то еще изменится. Что произойдет в этом случае?
Я думаю, что этот вопрос вызывает действительно интересный эксперимент, почему бы не попробовать создать свои собственные классы, связанные с потоком. Опубликуйте свой редизайн на CodePlex или Google Code, это был бы отличный учебный опыт и мог бы стать потенциально полезной библиотекой для использования другими.
Использование интерфейсов будет означать, что значение CanRead не может быть изменено во время выполнения. Класс FileStream изменяет свойство CanRead в зависимости от текущего состояния файла.
Интерфейсы могут использоваться слишком часто, и это может быть одним из таких случаев. Я считаю, что нынешний дизайн великолепен. Тот факт, что потоки могут изменять возможности во время выполнения, означает, что IReadable / IWritable / ISeekable не устранит необходимость в CanRead, CanWrite и CanSeek, поэтому вы просто увеличиваете сложность без реальной выгоды, кроме устранения нескольких методов и свойств-заглушек. в производных классах.
Лично я предпочитаю, чтобы класс потока было проще использовать, чем писать, потому что вы напишете его один раз и будете использовать много раз.
Вероятно, они не использовали интерфейсы, потому что в то время не было методов расширения. Если вы хотите, чтобы у каждого потока были такие вещи, как метод ReadByte по умолчанию, вам нужно было использовать класс.
Я написал сообщение в блоге пару месяцев назад о том, почему мне не нравятся IO.Stream и то, что я думал, должно быть сделано. По сути, это сводится к тому, что потоки не очень безопасны по типам.
Class Stream использует дополнительный шаблон функций, вы можете прочитать больше здесь .
Вы можете использовать подход (Java *) для написания почти пустого класса MyStream
, который наследует базовый класс Stream
, но предоставляет большую часть методы-члены (например, CanSeek ()
) и встраивание их в разумное поведение по умолчанию (например, бросание NotImplemented
). Затем ваш настоящий класс просто расширяет ваш класс MyStream
, реализуя два или три оставшихся метода, которые вам действительно нужны.
Повторно используя свой класс MyStream
, вы значительно сэкономите изобретением колеса.
* Это называется класс абстрактного адаптера в библиотеках Java.