Как утверждали другие, тип String
в .NET неизменен, а ссылка передается по значению.
В исходном коде, как только эта строка выполнит:
test = "after passing";
, тогда test
больше не будет ссылаться на на исходный объект. Мы создали новый объект String
и назначили test
для ссылки на этот объект в управляемой куче.
Я чувствую, что многие люди сбиваются с толку здесь, потому что нет видимого формального конструктора, чтобы напомнить им. В этом случае это происходит за кулисами, так как тип String
поддерживает язык в том, как он построен.
Следовательно, поэтому изменение на test
не видно за пределами области TestI(string)
метод - мы передали ссылку по значению, и теперь это значение изменилось! Но если ссылка String
была передана по ссылке, то при изменении ссылки мы увидим ее вне области действия метода TestI(string)
.
В этом случае необходимо либо ключевое слово ref, либо выдать. Я чувствую, что ключевое слово out
может быть немного лучше подходит для этой конкретной ситуации.
class Program
{
static void Main(string[] args)
{
string test = "before passing";
Console.WriteLine(test);
TestI(out test);
Console.WriteLine(test);
Console.ReadLine();
}
public static void TestI(out string test)
{
test = "after passing";
}
}
Почему бы тебе просто не использовать счет?
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Long> cQuery = builder.createQuery(Long.class);
Root<Brand> from = cQuery.from(Brand.class);
CriteriaQuery<Long> select = cQuery.select(builder.count(from));
.
.
//Created many predicates and added to **Predicate[] pArray**
.
.
select.where(pArray);
// Added orderBy clause
TypedQuery<Long> typedQuery = em.createQuery(select);
typedQuery.setFirstResult(startIndex);
//typedQuery.setMaxResults(pageSize);
// here is the size of your query
Long result = typedQuery.getSingleResult();