我的单例访问器方法通常是以下的一些变体:
static MyClass *gInstance = NULL;
+ (MyClass *)instance
{
@synchronized(self)
{
if (gInstance == NULL)
gInstance = [[self alloc] init];
}
return(gInstance);
}
Run Code Online (Sandbox Code Playgroud)
我可以做些什么来改善这个?
使用以下代码,我尝试定义一个简单的模型类,它是可用的初始化器,它将(json-)字典作为参数.nil如果未在原始json中定义用户名,则应返回初始化程序.
1.为什么代码不能编译?错误消息说:
在从初始化程序返回nil之前,必须初始化类实例的所有存储属性.
这没有意义.我计划返回时为什么要初始化这些属性nil?
2.我的方法是正确的,还是会有其他想法或共同模式来实现我的目标?
class User: NSObject {
let userName: String
let isSuperUser: Bool = false
let someDetails: [String]?
init?(dictionary: NSDictionary) {
if let value: String = dictionary["user_name"] as? String {
userName = value
}
else {
return nil
}
if let value: Bool = dictionary["super_user"] as? Bool {
isSuperUser = value
}
someDetails = dictionary["some_details"] as? Array
super.init()
}
}
Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用F#,我找不到像C#3那样进行对象初始化的语法.
即这样:
public class Person {
public DateTime BirthDate { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如何在F#中编写以下内容:
var p = new Person { Name = "John", BirthDate = DateTime.Now };
Run Code Online (Sandbox Code Playgroud) 我最近在C#中学习了对象初始化程序,但是现在我想知道它在与构造函数冲突时是如何工作的.
public class A
{
public bool foo { get; set; }
public A()
{
foo = true;
}
public A(bool bar)
{
foo = bar;
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时会发生什么?
public class B
{
a = A() {foo = false};
b = A(true) {foo = false};
}
Run Code Online (Sandbox Code Playgroud)
构造函数中的默认值是一个bool开始为true并且可以更改的好方法吗?
public A(bar=true)
{
foo = bar;
}
Run Code Online (Sandbox Code Playgroud) .Net中的某些集合类型具有可选的"初始容量"构造函数参数.例如:
Dictionary<string, string> something = new Dictionary<string,string>(20);
List<string> anything = new List<string>(50);
Run Code Online (Sandbox Code Playgroud)
我似乎无法找到MSDN上这些对象的默认初始容量.
如果我知道我只会在字典中存储12个左右的项目,那么将初始容量设置为20就没有意义吗?
我的理由是,假设容量增长的速度与StringBuilder一样,每次容量达到时都会增加一倍,并且每次重新分配都很昂贵,为什么不预先设置你知道会保存数据的大小,还有一些额外的房间以防万一?如果初始容量是100,并且我知道我只需要十几个,那么好像其余的内存都没有分配.
有没有办法在Visual Studio中逐步调试对象初始化程序代码?
例:
return new Veranstaltung()
{
ID = tblVeranstaltung.VeranstaltungsID,
Titel = tblVeranstaltung.Titel,
KursNummer = tblVeranstaltung.Kursnummer,
ErsterTermin = tblVeranstaltung.ersterTermin,
Dauer = tblVeranstaltung.schulungsTage,
StartZeit = tblVeranstaltung.BeginnZeit,
EndZeit = tblVeranstaltung.Endzeit,
KostenNettoValue = tblVeranstaltung.PreisNetto ?? default(decimal),
IsLastMinute = tblVeranstaltung.lastMinute == 1,
IsVerkuerzt = tblVeranstaltung.istVerkuerzt == 1,
IsGeschlossen = tblVeranstaltung.istGeschlosseneVeranstaltung == 1,
IsIntern = tblVeranstaltung.istInterneVeranstaltung == 1,
StandortID = Convert.ToInt32(tblVeranstaltung.StandortID),
LastMinuteRabatt = tblVeranstaltung.lastMinuteRabatt ?? default(decimal)
};
Run Code Online (Sandbox Code Playgroud)
有时我在这种代码中遇到错误(例如当转换为int失败时)并且VS似乎无法单步执行它,它只会抛出整行的错误而我必须尝试哪些初始化失败.
是否有一种简单的方法来调试它,或者最好避免对象初始化器进行大型或复杂的初始化?
我正在使用VS 2010和C#4.0.
我ReSharper每天都在使用,今天我问自己为什么ReSharper在我这样做时会建议"使用对象初始化器":
MyClass myClass = new MyClass();
myClass.MyInt = 0;
myClass.MyString = string.Empty;
Run Code Online (Sandbox Code Playgroud)
它被替换为:
MyClass myClass = new MyClass
{
MyInt = 0,
MyString = string.Empty
};
Run Code Online (Sandbox Code Playgroud)
这是否可以优化代码的执行,还是仅仅是重新格式化的问题?
就个人而言,我喜欢它.但有时我讨厌它,因为这个:

我不能做step-by-step调试:(
我喜欢C#3初始化器语法并且使用它很多,但今天在查看Reflector时,出现了以下内容:
var binding = new WSHttpBinding
{
ReaderQuotas = { MaxArrayLength = 100000 },
MaxReceivedMessageSize = 10485760
};
Run Code Online (Sandbox Code Playgroud)
起初我认为这是一个错误,但它确实编译!我猜我一直都在学习新东西.:)
据我所知,它设置了MaxArrayLength属性的ReaderQuotas属性WSHttpBinding.
此语法是创建新ReaderQuotas对象然后设置属性,还是假设要初始化属性?这是用于初始化"子"属性的一般方式吗?
我发现语法有点令人困惑......
使用对象初始化程序语法设置属性的顺序是否以完全相同的顺序执行?
例如,如果我这样做:
var s = new Person { FirstName = "Micah",
LastName = "Martin",
IsLoaded = true
}
Run Code Online (Sandbox Code Playgroud)
每个属性都会以相同的顺序设置吗?
Resharper刚刚向我建议了以下重构:
// Constructor initializes InitializedProperty but
// the UninitializedSubproperty is uninitialized.
var myInstance = new MyClass();
myInstance.InitializedProperty.UninitializedSubproperty = new MyOtherClass();
// becomes
var myInstance = new MyClass
{
InitializedProperty = { UninitializedSubproperty = new MyOtherClass() }
};
Run Code Online (Sandbox Code Playgroud)
我以前从未见过这种对象初始化.特别是我不知道怎么做
InitializedProperty = { UninitializedSubproperty = new MyOtherClass() }
Run Code Online (Sandbox Code Playgroud)
没有任何意义 - 它不会分配任何东西InitializedProperty.
是否在任何地方指定了此行
c# ×6
.net ×4
syntax ×2
collections ×1
constructor ×1
debugging ×1
f# ×1
objective-c ×1
optimization ×1
resharper ×1
singleton ×1
swift ×1