标签: access-modifiers

为什么C#不支持Protected和Internal可访问性的交集?

内部保护:

工会保护内部辅助功能(这比限制较少的保护内部单独)

CLR拥有的概念交集保护内部辅助功能,但C#不支持这一点.

所以我的问题是:

省略这个访问修饰符的含义是什么,有一个具体的原因吗?那么为什么C#不应该支持呢?

c# clr access-modifiers

17
推荐指数
2
解决办法
1214
查看次数

防止visual studio将setter方法限制为内部

好吧,我使用visual studio 2015 CE,更新2.我通常做的一个生产力黑客是我创建空模型类,如:

public class PersonModel
{
}
Run Code Online (Sandbox Code Playgroud)

然后在选择表达式中使用它们,如:

db.People.Where(p => someCondition)
.Select(p => new PersonModel
{
    Id = p.Id,
    Name = p.Name,
    //set other properties
}).ToList();
Run Code Online (Sandbox Code Playgroud)

然后我去了又非现有属性IdName...并按Control+.要求Visual Studio来generate property Id对我.一切都很好,但它会创造:

public int Id { get; internal set; }
Run Code Online (Sandbox Code Playgroud)

如果我在asp.net webapi模型绑定中使用相同的方法,绑定将无声地失败并给我Id = 0.

所以我的问题是:有没有选择让VS创建公共setter,即:

public int Id { get; set; }
Run Code Online (Sandbox Code Playgroud)

.net c# properties access-modifiers visual-studio-2015

17
推荐指数
1
解决办法
548
查看次数

C#中接口成员的访问修饰符

我从以下属性收到编译错误.
错误是:

"修饰符'public'对此项无效"

public System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
    get { return properties; }
    set { properties = value; }
}
Run Code Online (Sandbox Code Playgroud)

但如果我删除IWorkItemControl它编译好.

为什么我收到此错误,签名中是否有/没有接口名称有什么区别?

c# interface access-modifiers explicit-interface

16
推荐指数
1
解决办法
1万
查看次数

单个文件中的多个类:此处不允许使用修饰符私有

我无法理解为什么这段代码无法编译:

class A {
    public static void main(String[] args) {
        System.out.println("hi");
    }
}

private class B {
    int a;
}
Run Code Online (Sandbox Code Playgroud)

我将内容保存在一个名为的文件中A.java- 我收到一个错误:

modifier private not allowed here // where I have defined class B
Run Code Online (Sandbox Code Playgroud)

当我尝试B作为私有和受保护时,会发生这种情况.有人可以解释一下这背后的原因吗?

谢谢 !

java access-modifiers

16
推荐指数
1
解决办法
2万
查看次数

如何更改用户控件的访问修饰符

我有一个在xaml中创建的用户控件,让我们将其命名为"View".在View.xaml.cs中,我将类View的访问修饰符更改为internal:

internal partial class View : ViewBase { ... }
Run Code Online (Sandbox Code Playgroud)

更改访问修饰符后,编译器会声明错误:

"ABView"的部分声明具有冲突的可访问性修饰符

我的第一个猜测是视图必须通过xaml代码在内部进行.所以我添加了两行xaml:

x:Name="View"
x:FieldModifier="internal"
Run Code Online (Sandbox Code Playgroud)

但这并没有解决错误.我在哪里更改访问修饰符以使内部视图?

c# wpf xaml class-design access-modifiers

16
推荐指数
1
解决办法
9424
查看次数

为什么只有在声明自定义构造函数时才能访问基类析构函数?

Comeau,g ++(ideone)和EDG接受以下代码而无需诊断.Visual C++编译成功,尽管有警告C4624.

class indestructible_base
{
  ~indestructible_base();
};

class T : indestructible_base
{
public:
  //T() {}
};

int main(void) { new T(); }
Run Code Online (Sandbox Code Playgroud)

取消注释构造函数,它不再编译.

也许这是规则,如果在构造函数内发生异常,必须销毁子对象?看起来很奇怪,因为身体是空的,不能引起异常.即便如此,添加一个异常规范担保,不会抛出任何异常(throw()noexcept)并且没有任何区别.

为什么用户声明的构造函数需要访问基类析构函数,而自动生成的构造函数则不需要?

这个问题的灵感来自于:防止析构函数在C++中运行

c++ inheritance destructor access-modifiers language-lawyer

16
推荐指数
1
解决办法
642
查看次数

Spring @Autowired字段 - 访问修饰符,私有或包私有?

假设我们@Autowired在类中的各个字段上使用注释,并且我们没有编写也可以设置字段的setter或构造函数.

问题 - 访问修饰符应该是什么,private或者package-private(即没有)?

例如:

public class MyClass {
    @Autowired
    private MyService myService;
}
Run Code Online (Sandbox Code Playgroud)

VS

public class MyClass {
    @Autowired
    MyService myService;
}
Run Code Online (Sandbox Code Playgroud)

在第一种情况下(private字段)Spring使用反射来连接字段,即使它没有setter.

第二种情况(package-private字段)允许我们能够访问这些字段(例如,设置模拟),如果我们需要扩展类以进行测试.

所以这两种情况都很好,但更值得推荐,特别是在测试方面?

java spring unit-testing private access-modifiers

16
推荐指数
3
解决办法
2万
查看次数

Java:从内部类访问受保护的字段

最近,当我java.lang.IllegalAccessError尝试从内部类访问由不同类加载器加载的外部父类中声明的受保护字段时,我遇到了运行时错误的问题。简要地:

  1. Parent有受保护的字段p
  2. Outer扩展Parent
  3. ClassInner是在 class 中定义的内部类Outer
  4. Inner类里面有一个代码:Outer.this.p.
  5. 所有类都在同一个包中声明。

通常它的编译和运行正常,直到ParentOuter类是由不同的类加载器加载。在这种情况下,我们java.lang.IllegalAccessError在尝试Outer.this.pInner. 我发现了一个旧的错误报告(这似乎是一个功能)描述了这种行为:

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6258289

但分辨率对我来说听起来自相矛盾:

关键是在失败的情况下,内部类不在同一个包中(并且不是 ConcreteCommand/AbstractCommand 的子类)。这只是违反了受保护类的 Java 规范。

听起来是对的。但是,如果我们在不同的包中声明ParentOuter类,但使用单个类加载器加载(只需创建没有任何 jar 加载的示例控制台应用程序),我们就不会收到任何错误。因此,从技术上讲,它违反了受保护类的 Java 规范,但由于我们使用了内部类,因此它可以工作。

因此,对于“不同的包”的两种情况,我们有不同的行为。

  1. 在不同的包中声明,由单个类加载器加载 - 好的。
  2. 在单个包中声明,由不同的类加载器加载 - 不正常。

有人可以清楚地解释内部类如何访问父类的字段以及为什么它在两种情况下的工作方式不同吗?

java protected access-modifiers classloader inner-classes

16
推荐指数
1
解决办法
367
查看次数

您是否曾见过合理使用受保护的内部访问修饰符的设计?

我没有,但我不说没有.

所有阅读此内容的C#开发人员可能都知道内部受保护的内容以及何时使用它.我的问题很简单:您是否真的使用过它,或者使用受保护的内部访问修饰符处理成功设计的项目?如果是的话,请分享您的知识并发布好样本,我终于可以欣赏这个棘手的修饰符的巧妙使用.

//我相信这不是主观的,我实际上是在寻求答案;-)

c# access-modifiers

15
推荐指数
2
解决办法
844
查看次数

不能使用公共嵌套类作为私有方法参数

在以下代码中:

class Outer {
   private:
    void f_private(Outer::Inner in); // Wrong

   public:
    class Inner {};
    void f_public(Outer::Inner in); // OK
};
Run Code Online (Sandbox Code Playgroud)

f_private()不能使用嵌套类Outer::Inner作为参数类型。但是在f_public().

有人可以向我解释这是基于什么规则,它有什么好处?

c++ access-modifiers inner-classes public-members

14
推荐指数
1
解决办法
976
查看次数