我想创建一个简单的泛型函数
void Assign<T>(out T result)
{
Type type = typeof(T);
if (type.Name == "String")
{
// result = "hello";
}
else if (type.Name == "Int32")
{
// result = 100;
}
else result = default(T);
}
Run Code Online (Sandbox Code Playgroud)
用法:
int value;
string text;
Assign(value); // <<< should set value to 100
Assign(text); // <<< should set text to "hello"
Run Code Online (Sandbox Code Playgroud)
我的问题是如何编写代码来设置这些值,即.评论部分中缺少的代码.
谢谢你的帮助.
所以,给出以下代码
type MyClass () =
let items = Dictionary<string,int>()
do
items.Add ("one",1)
items.Add ("two",2)
items.Add ("three",3)
member this.TryGetValue (key,value) =
items.TrygetValue (key,value)
let c = MyClass ()
let d = Dictionary<string,int> ()
d.Add ("one",1)
d.Add ("two",2)
d.Add ("three",3)
Run Code Online (Sandbox Code Playgroud)
以及以下测试代码
let r1,v1 = d.TryGetValue "one"
let r2,v2 = c.TryGetValue "one"
Run Code Online (Sandbox Code Playgroud)
r1,v1行正常工作.r2,v2线炸弹; 抱怨c.TryGetValue必须给出一个元组.有趣的是,在每行中,TryGetValue的签名是不同的.如何让我的自定义实现显示与BCL版本相同的行为?或者,问另一种方式,因为F#有(隐含的)的元组参数,令行禁止参数和BCL参数的概念,我知道如何咖喱和元组风格的区分,我怎么能强迫第三样式(一拉BCL方法)?
如果不清楚,请告诉我.
我希望这个问题是关于主题的.
我正在进行代码审查,并偶然发现以下功能:
bool SomeFunc(std::string& o_xxx, char& o_yyy);
Run Code Online (Sandbox Code Playgroud)
该功能用于检索的值xxx和yyy由输出参数的装置的一些类的.
评论(后来用于自动记录)说:
...此函数通过引用返回[xxx]和[yyy] ...
显然,该函数返回一个表示成功或失败的布尔值.所以上面的句子需要改写.但是怎么样?通过out参数返回某些内容的正确术语(如果有的话)是什么,换句话说,填充引用传递的参数是什么?
问题是标记语言不可知,因为它不是C++特定的.但它也标记了C++,因为该示例使用的是C++.
我是一名试图学习C++ 11的C#开发人员.我正在尝试使用windns.h查询DNS.
我开始DnsQuery()并阅读,我需要释放结果记录输出参数DnsRecordListFree().C#方式可能是使用try-finally块来确保我释放资源,无论如何.
但是我了解到没有finally阻塞,并且windns.h真的应该与时俱进并实现符合RAII标准的接口(据我理解的典型建议).我试图创建一个RAII包装器类,而不是等待它发生,我试图使用析构函数调用DnsRecordListFree()并使用运算符重载转换来获取原始指针.
但我对如何正确使用此句柄或指针获取out参数感到困惑.在我研究的过程中,我学会了如何unique_ptr(我已经学过一些东西)可以与自定义删除器一起使用.
所以这是我迄今为止的简单代码.可能更多的错误不仅仅是这个,但我想我可以声明另一个PDNS_RECORD *presult并使用它作为out参数然后复制或移动或以其他方式将其值分配给a unique_ptr,但这听起来像是太多的工作/混乱.
在我看来,unique_ptr内部指针应该初始化为NULL,我应该能够以某种方式将指针的地址传递给out参数,这DNSQuery将更新原始值,当unique_ptr我的函数中的范围超出范围时,DnsRecordListFree()调用将自动制作.我不知道为了最小的正确/安全使用找出正确的组合.
#include <iostream>
#include <fstream>
#include <memory>
#include <Windows.h>
#include <WinDNS.h>
using namespace std;
auto pdnsDeleter = [&](PDNS_RECORD *ptr){ if (ptr) DnsRecordListFree(ptr); };
int main(int argc, char **argv)
{
cout << "Hello World\n";
std::unique_ptr<PDNS_RECORD*, decltype(pdnsDeleter)> results(0, pdnsDeleter);
if (DnsQuery(L"google.com", DNS_TYPE_A, DNS_QUERY_STANDARD, NULL, ??results??, NULL))
{
cout << …Run Code Online (Sandbox Code Playgroud) 以下方法无法编译.Visual Studio警告"可能无法在匿名方法中使用out参数".该WithReaderLock(Proc action)方法需要一个delegate void Proc().
public Boolean TryGetValue(TKey key, out TValue value)
{
Boolean got = false;
WithReaderLock(delegate
{
got = dictionary.TryGetValue(key, out value);
});
return got;
}
Run Code Online (Sandbox Code Playgroud)
获得这种行为的最佳方法是什么?(请不要提供有关线程安全词典的建议,这个问题一般是为了解决out参数问题).
考虑这两个PostgreSQL函数:
CREATE OR REPLACE FUNCTION f_1 (v1 INTEGER, v2 OUT INTEGER)
AS $$
BEGIN
v2 := v1;
END
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION f_2 (v1 INTEGER)
RETURNS TABLE(v2 INTEGER)
AS $$
BEGIN
v2 := v1;
END
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
在任何"普通"的过程SQL语言(例如Transact-SQL)中,两种类型的函数将完全不同.f_1实际上是一个程序,而是f_2一个表值函数.在SQL Server中,后者是这样返回的INFORMATION_SCHEMA.ROUTINES:
SELECT r.routine_schema, r.routine_name
FROM information_schema.routines r
WHERE r.routine_type = 'FUNCTION'
AND r.data_type = 'TABLE'
Run Code Online (Sandbox Code Playgroud)
但是在PostgreSQL中,这不起作用.以下查询显示f_1和的签名之间基本没有区别f_2:
SELECT r.routine_name, r.data_type, p.parameter_name, p.data_type
FROM information_schema.routines r
JOIN information_schema.parameters p
USING …Run Code Online (Sandbox Code Playgroud) sql postgresql stored-procedures user-defined-functions out-parameters
我针对我创建的对象运行了VS 2008代码分析工具,并收到了以下建议......
警告147 CA1021:Microsoft.Design:考虑一种不要求'returnValue'为out参数的设计.
我发现"out"参数相当有用,并没有意识到它们被认为是一种不受欢迎的设计实践.我想知道是否有人可以了解我收到此警告的原因?如果这是不好的做法?为什么?什么是好的做法?
我很感激任何建议.
编译器抱怨resultingThing在下面的代码中被分配之前正在使用.
private IEnumerable<IThing> FindThings(dynamic spec)
{
if (spec == null)
yield break;
IThing resultingThing;
if (spec.Something > 0 && dictionary.TryGetValue(spec.Something, out resultingThing))
yield return resultingThing;
else
// ...
}
Run Code Online (Sandbox Code Playgroud)
为什么声称这个?
我已经尝试了一个不同版本的方法,其中没有产量使用(例如,只是return IEnumerable<IThing>)但是使用动态参数,我尝试了一种不传递动态的方法版本(即我们在以前版本的C#).这些编译.
第一个问题: 我试图返回一个OUT参数而不是带注释的结果集.首先,它甚至可能吗?如果是的话,怎么会这样呢?
MyBatis:3.0.6
数据库:SQL Server 2008
以下是UserDAO中我的方法调用语法的示例:
@Select(value= "{ CALL saveUser( "
+ "#{userId, mode=IN, jdbcType=INTEGER},"
+ "#{firstname, mode=IN, jdbcType=VARCHAR},"
+ "#{lastname, mode=IN, jdbcType=VARCHAR},"
+ "#{message, mode=OUT, jdbcType=VARCHAR}"
+ ")}")
@Options(statementType=StatementType.CALLABLE)
public String saveUser(
@Param("userId") int userId,
@Param("firstname") String firstname,
@Param("lastname") String lastname);
Run Code Online (Sandbox Code Playgroud)
我从所有"保存"程序返回一条消息,因此我可以向用户返回响应:"用户保存成功","保存用户错误","您无权保存此用户"等.我知道返回结果集会解决问题,只是我不想改变我的所有程序!
第二个问题:是否可以返回从多个OUT参数填充的"SaveProcedureResponse"?例如:
@Select(value= "{ CALL saveUser( "
+ "#{userId, mode=IN, jdbcType=INTEGER},"
+ "#{firstname, mode=IN, jdbcType=VARCHAR},"
+ "#{lastname, mode=IN, jdbcType=VARCHAR},"
+ "#{message, mode=OUT, jdbcType=VARCHAR},"
+ "#{status, mode=OUT, jdbcType=VARCHAR},"
+ "#{returnCode, mode=OUT, jdbcType=INTEGER}"
+ ")}")
@Options(statementType=StatementType.CALLABLE)
public SaveProcedureResponse …Run Code Online (Sandbox Code Playgroud) 简短版本:参数后面的命名参数out给出了编译器错误,但我在语言规范中找不到对此行为的任何支持.
长版:
我正在使用Enum.TryParse<TEnum>三个参数重载,但我更喜欢命名ignoreCase参数以使我的代码更清晰,调用如下:
MyEnum res;
b = Enum.TryParse<MyEnum>(inputString, true, out res);
Run Code Online (Sandbox Code Playgroud)
留下布尔不清楚的含义(除非这个方法已知1).因此我想用:
b = Enum.TryParse<MyEnum>(inputString, out res, ignoreCase: true);
Run Code Online (Sandbox Code Playgroud)
但是,编译器将此报告为错误:
命名参数'ignoreCase'指定已为其指定了位置参数的参数
并且IDE突出显示该ignoreCase参数.针对.NET 4的VS2010以及针对4或4.5的VS11 Beta都会产生相同的结果.在所有情况下,命名out参数都会删除错误.
b = Enum.TryParse<MyEnum>(inputString, result: out res, ignoreCase: true);
Run Code Online (Sandbox Code Playgroud)
我已经在框架和我的程序集中尝试了许多不同的方法(包括避免泛型)2:总是相同的结果:out参数后跟命名参数会产生错误.
我看不出有什么理由错误,并且第7.5.1节参数列表中的C#语言规范:4.0版似乎并没有提供任何理由的out,然后命名参数应该给出一个错误.错误的文本似乎支持解释为一个错误:没有位置参数可能是一个有效的匹配ignoreCase.
我对规范的解读是错误的吗?或者这是编译器错误?
C#7.2更新
当使用C#7.2解除调用时,对所有命名参数的这种限制必须遵循位置参数.
请参阅https://docs.microsoft.com/en-gb/dotnet/csharp/whats-new/csharp-7-2#non-trailing-named-arguments.
1因此,框架设计指南中的建议更倾向于enum参数.
2例如:给定:
private static void TestMethod(int one, float two, out …Run Code Online (Sandbox Code Playgroud) out-parameters ×10
c# ×4
c++ ×2
.net ×1
byref ×1
c#-4.0 ×1
compiler-bug ×1
dynamic ×1
f# ×1
generics ×1
java ×1
mybatis ×1
postgresql ×1
sql ×1
terminology ×1
warnings ×1
winapi ×1