无参数构造函数是一个要求(像Hibernate这样的工具在这个构造函数上使用反射来实例化对象).
我得到了这个手作波形的答案,但有人可以进一步解释吗?谢谢
我试图将对象传递给Attributes构造函数,如下所示:
[PropertyValidation(new NullOrEmptyValidatorScheme())]
public string Name { get; private set; }
Run Code Online (Sandbox Code Playgroud)
使用此属性构造函数:
public PropertyValidationAttribute(IValidatorScheme validator) {
this._ValidatorScheme = validator;
}
Run Code Online (Sandbox Code Playgroud)
代码不会编译.如何将对象传递给上面的属性?
编辑:是NullOrEmptyValidatorScheme实现IValidatorScheme.
错误:错误CS0182:属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式.
equals
String类中方法的代码是
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
我有一个问题 - 为什么这个方法不使用hashCode()?
据我所知,hashCode()可以快速比较两个字符串.
更新:我知道,两个不相等的字符串,可以有相同的哈希值.但两个相等的字符串具有相等的哈希值.因此,通过使用hashCode(),我们可以立即看到两个字符串是不相等的.
我只是想,使用hashCode()方法可以很好的过滤器在equals
.
更新2:这里有一些代码,我们在这里谈论.
这是String方法等于的示例 …
我正在阅读"清洁代码",并且无法弄清楚如何将我的一些功能(通常是构造函数)保持为最多3个参数.
通常我的对象需要大量的信息才能工作 - 我是否应该创建一个小构造函数,然后使用mutator函数为它们提供所有信息?这似乎没有比使用一个大的构造函数更好.
举个例子,我有一个"MovablePatch"类.它允许用户在窗口中拖动方块.它需要几个参数,包括Radius,Color,Renderer,InitialPosition和Visibility.目前我从我的GUI收集所有这些,然后调用:
MovablePatch(int radius, Renderer* renderer, Color color, Position initial, bool visibility)
Run Code Online (Sandbox Code Playgroud)
这些只是我在这堂课中需要的一些东西.任何人都可以建议我如何打包这些信息传递给构造函数?我没有看到任何明显的"打破小班"在这里出现.
我有两个类都在单独的头文件中定义.每个文件都有一个其他类的字段.现在我在每个文件的头文件中包含了其他文件的头文件,但是编译器正在生成错误.我错过了什么?
由于C#支持Int8
,Int16
,Int32
和Int64
,为什么语言的设计者选择定义int
的别名,Int32
而不是允许其根据是什么原生架构认为是一个变化的word
?
我没有特别需要int
表现出不同于它的方式,我只是要求纯粹的百科全书兴趣.
我认为,一个64位RISC架构可以想见,存在这将最有效地只支持64位的数量,并在其中的32位数量操作将需要额外的操作.在程序坚持使用32位整数的世界中,这样的架构将处于不利地位,这是另一种说C#成为未来语言的方式,这实际上阻止了硬件设计者提出这样的问题.未来的建筑.
StackOverflow不鼓励推测答案,所以请仅在您的信息来自可靠来源时回答.我注意到SO的一些成员是微软内部人士,所以我希望他们能够在这个问题上启发我们.
注1:我确实阅读了所有答案和SO的所有注释:假设int在C#中总是32位是否安全?但是没有找到关于我在这个问题上提出的原因的任何暗示.
注2:这个问题的可行性上也是如此(不了了之了)这里讨论:元:我能问一个"为什么他们做这种方式"类型的问题?
有没有办法强制编译器限制自定义属性的使用仅用于特定属性类型,如int,short,string(所有基本类型)?
类似于AttributeUsageAttribute的ValidOn- AttributeTargets枚举.
我想用泛型和varargs实现一个函数.
public class Question {
public static <A> void doNastyThingsToClasses(Class<A> parent, Class<? extends A>... classes) {
/*** something here ***/
}
public static class NotQuestion {
}
public static class SomeQuestion extends Question {
}
public static void main(String[] args) {
doNastyThingsToClasses(Object.class, Question.class, SomeQuestion.class); // OK
doNastyThingsToClasses(Question.class, SomeQuestion.class); // OK
doNastyThingsToClasses(Question.class, Object.class, SomeQuestion.class); // compilation failure
}
}
Run Code Online (Sandbox Code Playgroud)
这里的目的是断言传递给该函数的所有参数都是Class对象,扩展了作为第一个参数给出的Class.因此,main方法的两个第一行将编译,第三行将生成错误.
我的问题是:为什么我得到"类型安全:为varargs参数创建类的通用数组"消息前两行?
我在这里错过了什么吗?
附加问题:如何重新设计它以防止在每行调用"doNastyThingsToClasses"函数时显示此警告?我可以将其更改为"doNastyThingsToClasses(Class <A> parent,Class <?> ... classes)"并删除警告,但这也会删除编译时类型检查 - 如果我想要的话,那就太好了确保正确使用此功能.更好的解决方案?
如果我有
public <T> doSomething(T[] array)
{
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能T.class
从array
?
如果我这样做array.getClass()
,那就T[].class
取而代之.
我有自定义属性,如下所示:
[AttributeUsage(AttributeTargets.Field)]
public class EnumDisplayAttribute : Attribute
{
public string Description { get; private set; }
public string Code { get; private set; }
public EnumDisplayAttribute(string description = null, string code = null)
{
Description = description;
Code = code;
}
}
Run Code Online (Sandbox Code Playgroud)
两个构造函数参数都是可选的.
在像这样的字段上使用此属性时
public enum TransactionType
{
[EnumDisplay(code: "B")]
Bill,
[EnumDisplay(description: null, code: "C")]
CashReceipt,
}
Run Code Online (Sandbox Code Playgroud)
我没有在代码编辑器中看到任何波形,但我看到一个模糊的错误,没有任何文件行号列.错误消息是:
错误CS0182:属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式
单击该错误不会执行任何操作.也就是说,您不会导航到错误站点(显然,因为没有行号和列).
即使我像这样设置属性:
[EnumDisplay("This is a Bill")]
Run Code Online (Sandbox Code Playgroud)
编译器不喜欢它.
实际上,我被迫提供两个参数(已命名或未命名),以便将此属性用作属性.
当然,如果我将此属性用作常规类,如下所示:
var enumDisplayAttribute = new EnumDisplayAttribute();
enumDisplayAttribute = new EnumDisplayAttribute(description: "This is a …
Run Code Online (Sandbox Code Playgroud)