Вы можете сделать это следующим образом:
String s = "1234567890";
System.out.println(java.util.Arrays.toString(s.split("(?<=\\G...)")));
, который производит:
[123, 456, 789, 0]
Регулярное выражение (?<=\G...)
соответствует пустой строке, которая имеет последнее совпадение (\G
), за которым следуют три символа (...
) перед ним ((?<= )
)
Язык C # не включает синтаксис для выражения концепции «владения» объектом или управления временем жизни в отличие от Rust, поэтому от документации API зависит, принимает ли конструктор объекта свои аргументы или нет (и, следовательно, кто получает возможность позвонить .Dispose()
). Это не то, что компилятор C # может определить для вас. Однако реализации .Dispose()
должны быть идемпотентными в любом случае , поэтому нет никакого вреда в вызове .Dispose()
многократных (избыточных) раз.
Просто следуйте идиоматическим соглашениям C # для сложенных using
операторов:
using( SqlConnection c = new SqlConnection( connectionString ) )
using( SqlCommand cmd = c.CreateCommand() )
{
await c.OpenAsync().ConfigureAwait(false);
cmd.CommandText = "SELECT foo, bar FROM baz";
using( SqlDataReader rdr = await cmd.ExecuteReaderAsync().ConfigureAwait(false) )
{
...
}
}
Для меня я предпочитаю использовать второе решение, оно более тонкое, или вы можете использовать мой пример чуть ниже:
using (var sqlConnection = new SqlConnection(connection))
{
using (var command = new SqlCommand(query, sqlConnection))
{
using (var read = command.ExecuteReader())
{
// process on your read
}
}
}