标签: out-parameters

C#:如何使用带有"out"变量的泛型方法

我想创建一个简单的泛型函数

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)

我的问题是如何编写代码来设置这些值,即.评论部分中缺少的代码.

谢谢你的帮助.

c# generics out-parameters generic-method

8
推荐指数
1
解决办法
5621
查看次数

如何实现与Dictionary.TryGetValue相同的行为

所以,给出以下代码

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方法)?

如果不清楚,请告诉我.

.net implementation f# byref out-parameters

7
推荐指数
1
解决办法
1655
查看次数

将某些东西作为out参数返回的正确术语是什么?

我希望这个问题是关于主题的.

我正在进行代码审查,并偶然发现以下功能:

bool SomeFunc(std::string& o_xxx, char& o_yyy);
Run Code Online (Sandbox Code Playgroud)

该功能用于检索的值xxxyyy由输出参数的装置的一些类的.

评论(后来用于自动记录)说:

...此函数通过引用返回[xxx]和[yyy] ...

显然,该函数返回一个表示成功或失败的布尔值.所以上面的句子需要改写.但是怎么样?通过out参数返回某些内容的正确术语(如果有的话)是什么,换句话说,填充引用传递的参数是什么?

问题是标记语言不可知,因为它不是C++特定的.但它也标记了C++,因为该示例使用的是C++.

c++ language-agnostic terminology out-parameters

7
推荐指数
1
解决办法
206
查看次数

RAII,unique_ptr和out参数

我是一名试图学习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)

c++ winapi out-parameters dynamic-memory-allocation

7
推荐指数
1
解决办法
1277
查看次数

如何避免在匿名方法块中使用out参数?

以下方法无法编译.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参数问题).

c# anonymous-methods out-parameters

6
推荐指数
1
解决办法
3054
查看次数

PostgreSQL函数与OUT参数和TABLE结果之间是否存在任何形式上的差异?

考虑这两个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

6
推荐指数
1
解决办法
444
查看次数

代码分析回来时建议不要使用"out"参数

我针对我创建的对象运行了VS 2008代码分析工具,并收到了以下建议......

警告147 CA1021:Microsoft.Design:考虑一种不要求'returnValue'为out参数的设计.

我发现"out"参数相当有用,并没有意识到它们被认为是一种不受欢迎的设计实践.我想知道是否有人可以了解我收到此警告的原因?如果这是不好的做法?为什么?什么是好的做法?

我很感激任何建议.

c# warnings code-analysis out-parameters visual-studio-2008

5
推荐指数
1
解决办法
1428
查看次数

为什么C#编译器在'yield return'和动态之前声称'使用未赋值的变量'?

编译器抱怨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#).这些编译.

dynamic yield-keyword out-parameters c#-4.0

5
推荐指数
1
解决办法
206
查看次数

带有OUT参数的Java MyBatis存储过程调用

第一个问题: 我试图返回一个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)

java stored-procedures out-parameters mybatis

5
推荐指数
2
解决办法
4万
查看次数

在C#中混合和命名参数:为什么输出参数也需要命名?

简短版本:参数后面的命名参数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)

c# named-parameters out-parameters compiler-bug

5
推荐指数
1
解决办法
3651
查看次数