C# 在类外更改类属性

C# 在类外更改类属性,c#,encapsulation,C#,Encapsulation,我有一门公共课 public class Interview { public int InterviewId; public string ApplicantName; ... public List<AnsweredQuestions> AnsweredQuestions; public Questionnaire questionnaire; } 和一个问卷班 public class Questionnaire { pub

我有一门公共课

 public class Interview
{
    public int InterviewId;
    public string ApplicantName;
    ...
    public List<AnsweredQuestions> AnsweredQuestions;
    public Questionnaire questionnaire;

}
和一个问卷班

public class Questionnaire
{
    public int questionnaireId;
    public string outputFile;
    ...
}
如何防止修改主程序的属性:

interview.questionnaire.outputFile
我发现我可以在主程序中使用DocumentManager类,如下所示:

 Interview interview = new Interview();
 interview.InterviewId = 1;
interview = documentManager.GetInterviewSession();
interview.questionnaire = documentManager.GetQuestionnaireManagement();
interview.AnsweredQuestions = documentManager.GetInterviewAnsweredQuestions();
用这个

public class DocumentManager
{
    private readonly Interview _interview;

我确定我应该封装,但我不确定如何封装。任何帮助都将不胜感激。
谢谢

我不确定我是否完全理解这个问题,但这是只读封装的常用方法:

public class Questionnaire
{
    public string OutputFile { get; private set; }
}
这将创建一个名为
OutputFile
的属性,该属性可以公开读取,但只能由
问卷调查
类编写


或者,您可能希望使用
保护集
如果您希望从调查问卷派生的类能够设置
OutputFile

我不确定我是否完全理解这个问题,但这是只读封装的常用方法:

public class Questionnaire
{
    public string OutputFile { get; private set; }
}
这将创建一个名为
OutputFile
的属性,该属性可以公开读取,但只能由
问卷调查
类编写


或者,您可能希望使用
保护集
如果希望从调查问卷派生的类能够设置
OutputFile

如果需要设置某些属性,则可以在类的构造函数中提供这些属性

您还可以使用属性来指示属性getter和setter是否为private/public/internal/protected,而不是使用字段

在您的示例中,您可以将InterviewId作为一个属性,使用公共get访问器和专用set访问器。这意味着只有类本身可以设置interviewId。如果设置interviewId的唯一方法是在类的构造函数中,那么消费代码就没有办法更改它(当然除了使用反射)


如果需要指定某些属性,则可以在类的构造函数中提供这些属性

您还可以使用属性来指示属性getter和setter是否为private/public/internal/protected,而不是使用字段

在您的示例中,您可以将InterviewId作为一个属性,使用公共get访问器和专用set访问器。这意味着只有类本身可以设置interviewId。如果设置interviewId的唯一方法是在类的构造函数中,那么消费代码就没有办法更改它(当然除了使用反射)


谢谢,我会尝试保护集,即使还没有任何派生类。谢谢,我会尝试保护集,即使还没有任何派生类。
public class Questionnaire
{

    public Questionnaire(int questionnaireId, string outputFile)
    {
         QuestionnaireId = questionnaireId;
         OutputFile = outputFile
    } 

    public int QuestionnaireId {get; private set;} 
    public string OutputFile { get; private set; }
    ...
}