Используя Внутренние классы в C#

В основном JDBC используют два способа - с помощью проверки подлинности Windows и проверки подлинности SQL. Аутентификация SQL, вероятно, самая простая. То, что вы можете сделать, это что-то вроде:

String userName = "username";
String password = "password";

String url = "jdbc:sqlserver://MYPC\\SQLEXPRESS;databaseName=MYDB";

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection conn = DriverManager.getConnection(url, userName, password);

после добавления sqljdbc4.jar в путь сборки.

Для проверки подлинности Windows вы можете сделать что-то вроде:

String url = "jdbc:sqlserver://MYPC\\SQLEXPRESS;databaseName=MYDB;integratedSecurity=true";
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection conn = DriverManager.getConnection(url);

, а затем добавить путь к sqljdbc_auth.dll в качестве аргумента виртуальной машины (по-прежнему нужно sqljdbc4.jar в пути сборки).

Пожалуйста, посмотрите здесь для краткое пошаговое руководство, показывающее, как подключиться к SQL Server с Java, используя jTDS и JDBC, если вам нужно больше деталей. Надеюсь, это поможет!

26
задан DevinB 29 April 2009 в 21:55
поделиться

8 ответов

Обычно я резервирую внутренние классы для одной из двух целей:

  1. Публичные классы, которые наследуются от своего родительского класса, где родительский класс является абстрактной базовой реализацией с одним или несколькими абстрактными методами и каждый подкласс - это реализация, которая обслуживает конкретную реализацию. после прочтения Framework Design and Guidelines я вижу, что это помечено как «Избегать», однако я использую его в сценариях, похожих на enums - хотя это, вероятно, и создает плохое впечатление

  2. Внутренние классы являются частными и единицы бизнес-логики или иным образом тесно связаны с их родительским классом таким образом, что они в корне нарушаются при использовании или использовании любым другим классом.

Для всех остальных случаев я стараюсь держать их в том же пространстве имен и на том же уровне доступности, что и их потребитель / логический родитель - часто с именами, которые немного менее дружественны, чем «основной» класс.

На большом В проектах вы будете удивлены, как часто вы будете изначально создавать сильно связанный компонент только потому, что его первичная или основная цель делает его логичным - однако, если у вас нет очень веской или технической причины заблокировать его и скрыть от зрение, тогда есть небольшой вред в разоблачении класса, так что другие компоненты могут его потреблять.

Редактировать Имейте в виду, что даже если мы говорим о подклассах, они должны быть более или менее хорошо спроектированы и слабосвязанные компоненты. Даже если они являются частными и невидимы для внешнего мира, сохраняя минимальную «площадь поверхности»

25
ответ дан 28 November 2019 в 04:32
поделиться

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

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

9
ответ дан Paul Alexander 15 October 2019 в 07:22
поделиться

Здесь приведен практический пример вложенного класса, который может дать вам представление об их использовании (добавлен некоторый модульный тест)

namespace CoreLib.Helpers
{
    using System;
    using System.Security.Cryptography;

    public static class Rnd
    {
        private static readonly Random _random = new Random();

        public static Random Generator { get { return _random; } }

        static Rnd()
        {
        }

        public static class Crypto
        {
            private static readonly RandomNumberGenerator _highRandom = RandomNumberGenerator.Create();

            public static RandomNumberGenerator Generator { get { return _highRandom; } }

            static Crypto()
            {
            }

        }

        public static UInt32 Next(this RandomNumberGenerator value)
        {
            var bytes = new byte[4];
            value.GetBytes(bytes);

            return BitConverter.ToUInt32(bytes, 0);
        }
    }
}

[TestMethod]
public void Rnd_OnGenerator_UniqueRandomSequence()
{
    var rdn1 = Rnd.Generator;
    var rdn2 = Rnd.Generator;
    var list = new List<Int32>();
    var tasks = new Task[10];
    for (var i = 0; i < 10; i++)
    {
        tasks[i] = Task.Factory.StartNew((() =>
        {
            for (var k = 0; k < 1000; k++)
            {
                lock (list)
                {
                    list.Add(Rnd.Generator.Next(Int32.MinValue, Int32.MaxValue));
                }
            }
        }));
    }
    Task.WaitAll(tasks);
    var distinct = list.Distinct().ToList();
    Assert.AreSame(rdn1, rdn2);
    Assert.AreEqual(10000, list.Count);
    Assert.AreEqual(list.Count, distinct.Count);
}

[TestMethod]
public void Rnd_OnCryptoGenerator_UniqueRandomSequence()
{
    var rdn1 = Rnd.Crypto.Generator;
    var rdn2 = Rnd.Crypto.Generator;
    var list = new ConcurrentQueue<UInt32>();
    var tasks = new Task[10];
    for (var i = 0; i < 10; i++)
    {
        tasks[i] = Task.Factory.StartNew((() =>
        {
            for (var k = 0; k < 1000; k++)
            {
                    list.Enqueue(Rnd.Crypto.Generator.Next());
            }
        }));
    }
    Task.WaitAll(tasks);
    var distinct = list.Distinct().ToList();
    Assert.AreSame(rdn1, rdn2);
    Assert.AreEqual(10000, list.Count);
    Assert.AreEqual(list.Count, distinct.Count);
}
0
ответ дан alhpe 15 October 2019 в 07:22
поделиться

Мне лично нравится иметь один класс на файл и внутренние классы как часть этого файла. Я считаю, что внутренние классы, как правило (почти всегда), должны быть частными и являются деталями реализации класса. Хранение их в отдельном файле приводит к путанице, [IM]. Использование областей кода для обтекания внутренних классов и скрытия их данных в данном случае хорошо работает и не позволяет работать с файлом. Области кода сохраняют внутренний класс «скрытым», и, поскольку это частная деталь реализации, это меня устраивает.

3
ответ дан 28 November 2019 в 04:32
поделиться

Относительно только того, как структурировать такого зверя ...

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

// main class in file Outer.cs
namespace Demo
{
  public partial class Outer
  {
     // Outer class
  }
}

// nested class in file Outer.Nested1.cs
namespace Demo
{
  public partial class Outer
  {
    private class Nested1
    {
      // Nested1 details
    }
  }
}

Во многом таким же образом вы часто видите (явные) интерфейсы в их собственном файле. например, Outer.ISomeInterface.cs , а не редактор по умолчанию #region их.

Структура файлов вашего проекта начинает выглядеть как

   /Project/Demo/ISomeInterface.cs
   /Project/Demo/Outer.cs
   /Project/Demo/Outer.Nested1.cs
   /Project/Demo/Outer.ISomeInterface.cs

Обычно, когда мы делаем это для вариации шаблона Builder.

6
ответ дан 28 November 2019 в 04:32
поделиться

Я лично использую внутренние классы для инкапсуляции некоторых концепций и операций, используемых только внутри класса. Таким образом, я не загрязняю непубличный API этого класса и сохраняю API чистым и компактным.

Вы можете воспользоваться частичными классами, чтобы переместить определение этих внутренних классов в другой файл для лучшей организации. VS автоматически не группирует частичные файлы классов для вас, за исключением некоторых шаблонизированных элементов, таких как ASP.NET, формы WinForm и т. Д. Вам нужно будет отредактировать файл проекта и внести в него некоторые изменения. Вы можете посмотреть на одну из существующих группировок, чтобы увидеть, как это делается. Я полагаю, что есть некоторые макросы, которые позволяют группировать файлы частичных классов в обозревателе решений.

2
ответ дан 28 November 2019 в 04:32
поделиться

I don't have the book to hand, but the Framework Design Guidelines suggests using public inner classes as long as clients don't have to refer to the class name. private inner classes are fine: nobody's going to notice these.

Bad: ListView.ListViewItemCollection collection = new ListView.ListViewItemCollection();

Good: listView.Items.Add(...);

Regarding your large class: it's generally worthwhile splitting something like this into smaller classes, each with one specific piece of functionality. It's difficult to break it up initially, but I predict it'll make your life easier later on...

18
ответ дан 28 November 2019 в 04:32
поделиться

Я думаю, что это довольно субъективно, но я, вероятно, разделил бы их на отдельные файлы кода, сделав частичный класс "host".

Поступая таким образом, вы можете получить еще больше обзор, отредактировав файл проекта , чтобы группы файлов были такими же, как классы конструктора в Windows Forms. Думаю, я видел надстройку Visual Studio, которая делает это автоматически за вас, но не помню где.

РЕДАКТИРОВАТЬ:
Поразмыслив, я нашел надстройку Visual Studio для этого под названием VSCommands

8
ответ дан 28 November 2019 в 04:32
поделиться
Другие вопросы по тегам:

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