我正在阅读核心C#编程结构,并且很难将我的头部包裹在out参数修饰符周围.我知道通过阅读它做了什么,但我想在使用它的时候想到一个场景.
有人可以给我一个真实世界的例子吗?谢谢.
我理解,在引用类型上使用值类型的决定应该基于语义,而不是性能.我不明白为什么值类型可以合法地包含引用类型成员?这有几个原因:
首先,我们不应该构建一个需要构造函数的结构.
public struct MyStruct
{
public Person p;
// public Person p = new Person(); // error: cannot have instance field initializers in structs
MyStruct(Person p)
{
p = new Person();
}
}
Run Code Online (Sandbox Code Playgroud)
其次,由于值类型语义:
MyStruct someVariable;
someVariable.p.Age = 2; // NullReferenceException
Run Code Online (Sandbox Code Playgroud)
编译器不允许我Person在声明中初始化.我必须把它移到构造函数,依赖调用者,或期望一个NullReferenceException.这些情况都不是理想的.
.NET Framework是否在值类型中有任何引用类型的示例?我们什么时候应该这样做(如果有的话)?
根据CLI标准(分区IIA,第19章)和System.Reflection.ExceptionHandlingClauseOptions枚举的MSDN参考页面,有四种不同的异常处理程序块:
鉴于这些简短的解释(引自CLI标准,顺便说一句),这些应该映射到C#,如下所示:
catch (FooException) { … }Catch FooException When booleanExpression)finally { … }catch { … }一个简单的实验表明,这种映射不是.NET的C#编译器真正做的事情:
// using System.Linq;
// using System.Reflection;
static bool IsCatchWithoutTypeSpecificationEmittedAsFaultClause()
{
try
{
return MethodBase
.GetCurrentMethod()
.GetMethodBody()
.ExceptionHandlingClauses
.Any(clause => clause.Flags == ExceptionHandlingClauseOptions.Fault);
}
catch // <-- this is what the above code …Run Code Online (Sandbox Code Playgroud) F#给我带来了类型推理规则的一些麻烦.我正在编写一个简单的计算构建器,但无法使我的泛型类型变量约束正确.
我想要的代码在C#中如下所示:
class FinallyBuilder<TZ>
{
readonly Action<TZ> finallyAction;
public FinallyBuilder(Action<TZ> finallyAction)
{
this.finallyAction = finallyAction;
}
public TB Bind<TA, TB>(TA x, Func<TA, TB> cont) where TA : TZ
{ // ^^^^^^^^^^^^^
try // this is what gives me a headache
{ // in the F# version
return cont(x);
}
finally
{
finallyAction(x);
}
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我为F#版本提出的最佳(但非编译代码)是:
type FinallyBuilder<?z> (finallyAction : ?z -> unit) =
member this.Bind (x : ?a) (cont : ?a -> ?b) =
try …Run Code Online (Sandbox Code Playgroud) 给定一个序列,如S = {1,8,2,1,4,1,2,9,1,8,4},我需要找到包含S的所有元素的最小长度子序列(没有重复,顺序无所谓).如何以有效的方式找到这个子序列?
注意: S中有5个不同的元素:{1,2,4,8,9}.最小长度子序列必须包含所有这5个元素.
我正在考虑??在C#中使用运算符(null-coalescing operator).但是MSDN上的文档是有限的.
我的问题:如果左侧操作数不为null,右手操作数是否会被评估?
我在几种情况下看到这种情况,并且在基于Web的应用程序连接到SQL 2008 R2服务后端时是间歇性的.用户正在进行点2点连接,并且可以打开和关闭此功能.我认为这是带宽问题,直到我开始在与这个SQL服务器位于同一核心交换机上的终端服务器上看到它.我已经检查了远程连接已启用,在TCP/IP配置中正确设置了端口1433,我看到的唯一原因是远程连接中的超时设置设置为100000而不是无限制.
错误是
System.Data.SqlClient.SqlException(0x80131904):建立与SQL Server的连接时发生与网络相关或特定于实例的错误.服务器未找到或无法访问.验证实例名称是否正确,以及SQL Server是否配置为允许远程连接.(提供者:命名管道提供程序,错误:40 - 无法打开与SQL Server的连接)--->
System.ComponentModel.Win32Exception(0x80004005):找不到网络路径atRun Code Online (Sandbox Code Playgroud)System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover) at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) at …
我想通过分配setter方法mapState.我目前使用一种解决方法,我将我感兴趣的变量命名为(todo)作为临时名称(storetodo),然后在另一个计算变量中引用它todo.
methods: {
...mapMutations([
'clearTodo',
'updateTodo'
])
},
computed: {
...mapState({
storetodo: state => state.todos.todo
}),
todo: {
get () { return this.storetodo},
set (value) { this.updateTodo(value) }
}
}
Run Code Online (Sandbox Code Playgroud)
我想跳过额外的步骤并直接在其中定义getter,setter mapState.
我为什么要这样做?
正常的方法是使用mapMutations/ mapActions&mapState/ mapGetters
没有我上面说明的计算的get/set组合,并直接在HTML中引用变异:
<input v-model='todo' v-on:keyup.stop='updateTodo($event.target.value)' />
Run Code Online (Sandbox Code Playgroud)
getter/setter版本允许我简单地写:
<input v-model='todo' />
Run Code Online (Sandbox Code Playgroud) 这是关于用C#编写的.NET Windows Forms应用程序.我有一个DataGridView连接到数据库.它显示所选表的内容.
现在如果该表中有4行,它将显示4行.在此之后我能够进入5 日在DataGrid视图列.应该避免.现在我必须禁用新行的创建.我该怎么做?
有没有关于使用结构作为WCF服务的返回类型的官方建议?
我目前正在与一项我没有写过的服务进行互动,并发现自己受到启发,要求查看我的烦恼是否合理.
我过去总是使用类 - 可能部分是因为这是样本总是显示的,但正如我现在想的那样,出于其他"直观"的原因:
我通过定义一个单独的项目来开始合同样式,该项目的接口表示服务来回传递的类型.
我使用LINQ很多,因此对于可空性的测试是隐含的引用类型,而对于结构和其他值类型,我总是需要标记为可空.
虽然我承认它比我脑子里的项目符号列表更直观,但有些东西会马上来找我.我想问这个问题,因为我正在处理一个返回结构的服务,并且在处理返回值时必须写:
var foo = Bar.Value.MyField;
Run Code Online (Sandbox Code Playgroud)
代替
var foo = Bar.Value;
Run Code Online (Sandbox Code Playgroud) c# ×7
.net ×2
value-type ×2
algorithm ×1
datagridview ×1
f# ×1
generics ×1
named-pipes ×1
operators ×1
sql-server ×1
struct ×1
vue.js ×1
vuex ×1
wcf ×1
winforms ×1