Using Inner classes in C#

前端 未结 9 1934
粉色の甜心
粉色の甜心 2020-12-02 18:40

What are the best practices regarding the use and structure of inner classes in C#.

For instance if I have a very large base class and two large inner classes should

9条回答
  •  青春惊慌失措
    2020-12-02 19:25

    Here see a practical example of a nested class that could give you an idea of their use (added some unit test)

    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();
        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();
        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);
    }
    

提交回复
热议问题