在另一个私有类中创建私有类的新实例

时间:2015-06-30 01:55:47

标签: c# inner-classes private-members

是否可以在另一个私有类中创建私有类的实例? (不计入main()程序。)     而且,私有类中的方法是否可以返回私有类型对象?

这个问题的出现是因为我在C#5的C#Fundamentals上关注了PluralSight的Scott Allen。关于类和对象的第2课,他有一个代码示例:

public GradeStatistics ComputeStatistics()
{
    GradeStatistics stats = new GradeStatistics();
    ...
    ...
}

GradeStatistics在单独的类文件中定义,如:

class GradeStatisticss
{

}

内联评论:我不是在讨论嵌套类。我的意思是,你有两个类(单独的文件),我想知道一个类是否可以创建另一个类的实例(知道它们都是私有的)。

Edited with examples:

    private class Example1
    {

    }

    private class Example2

    {
        public Example1 DoSomeComputation()
        {
            return new Example1();
        }
    }

    private class Example3
    {
        Example1 ex1 = new Example1();
    }

Is Example3 able to create ex1? Can Example2 return a new instance of Example1?

3 个答案:

答案 0 :(得分:1)

  

是否可以在另一个私有类中创建私有类的实例?

仅当要在其中创建实例的私有类声明要创建实例的私有类时。如果它们没有嵌套,则无法实现。

  

私有类中的方法是否可以返回私有类型对象?

是的,它可以。

以下是一些显示所有内容的代码:

public class Tester {

    private class ThePrivateCreator {

        private class TheOtherPrivateClass {
        }

        public Object createObject() {
            return new TheOtherPrivateClass();
        }

    }

    public void canWeDoThis() {
        ThePrivateCreator c = new ThePrivateCreator();
        Console.WriteLine(c.createObject());
    }

}


class Program
{
    public static void Main(string[] args) {
        Tester t = new Tester();
        t.canWeDoThis();
    }
}

答案 1 :(得分:1)

没有。另一个类在另一个文件中无法访问私有类。原因是修饰符private是为了将数据或方法封装在该类中。如果要从不嵌套的其他类访问类,则应使用public或internal修饰符。如果它是嵌套的,您也可以使用protected修饰符。

答案 2 :(得分:0)

不确定你的想法,但这是一个可能的例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication26
{
    class Program
    {

        static void Main(string[] args)
        {
            private1 p1 = new private1();
            private2 p2 = p1.foo();
            Console.WriteLine(p2.Value);
            Console.ReadLine();
        }

        private class private1
        {

            public private2 foo()
            {
                private2 p2 = new private2("I was created inside a different private class!");
                return p2;
            }

        }

        private class private2
        {

            private string _value;
            public string Value
            {
                get { return _value; }
            }

            public private2(string value)
            {
                this._value = value;
            }
        }

    }
}